Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    102

    Algoritmo di compressione efficiente o ricorsivo

    Salve! Stavo cercando un modo per comprimere un array di byte (trasformazione di una BufferedImage) più volte... siccome una sola compressione mi diminuisce la dimensione di massimo metà, volevo ridurla dalle 5 alle 10 volte! L'immagine deve arrivare a pesare circa 25-30 kb. Se non può esistere una compressione ricorsiva, accetto anche una buona combinazione di più metodi, come di compressione dell'immagine, di scaling della qualità e altro, basta che arrivi a pesare da circa 300 kb che è l'immagine a 25-30! Grazie...

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    ti sconsiglio di reinventare la ruota.
    http://www.coderanch.com/t/526224/ja...ge-Compression
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    102
    Originariamente inviato da Andrea1979
    ti sconsiglio di reinventare la ruota.
    http://www.coderanch.com/t/526224/ja...ge-Compression
    L'operazione con l'Iterator l'ho già fatta, ma ottengo un'immagine di 1/3 della dimensione (addirittura con 0.3f come qualità) mentre mi servirebbe arrivare a 1/10 come detto sopra...

  4. #4
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Usare il formato gif è sconsigliato?
    Per gli Spartani e Sparta usa spartan Il mio github

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    102
    Originariamente inviato da linoma
    Usare il formato gif è sconsigliato?
    In che senso?

  6. #6
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Credo che ridurre il numero di colori a 256 riduca di 2/3
    Per gli Spartani e Sparta usa spartan Il mio github

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    102
    Originariamente inviato da linoma
    Credo che ridurre il numero di colori a 256 riduca di 2/3
    eh ma sempre poco è il rapporto devo arrivare a 1/10 dell'originale...

  8. #8
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    con questo:
    codice:
    import javax.imageio.*;
    import javax.imageio.stream.*;
    import java.util.*;
    import java.io.*;
    import java.awt.image.*;
    
    /**
     *
     * @author Andrea
     */
    public class ImageIOTest {
        
        static String src = "C:/Users/Andrea/Desktop/imgtest/src.jpg";
        static String dest = "C:/Users/Andrea/Desktop/imgtest/dest.jpg";
        
        public static void main (String[] args) throws Exception {
            
            BufferedImage bimg = ImageIO.read(new File(src));        
            Iterator<ImageWriter> i = ImageIO.getImageWritersByFormatName("jpeg"); 
            
            // Just get the first JPEG writer available  
            ImageWriter jpegWriter = i.next();  
            
            // Set the compression quality to 0.1  
            ImageWriteParam param = jpegWriter.getDefaultWriteParam();  
            param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);  
            param.setCompressionQuality(0.1f); 
            
            // Write the image to a file 
            
            FileImageOutputStream out = new FileImageOutputStream(new File(dest));  
            jpegWriter.setOutput(out);  
            jpegWriter.write(null, new IIOImage(bimg, null, null), param);  
            jpegWriter.dispose();  
            out.close();         
        }
        
    }
    che altro non è che il codice di cui alla pagina che ti avevo linkato prima, ma con una compressione un po' più spinta, da una jpeg panoramica (4994 x 1008, 1.95MB) ottengo un file di circa 115KB, quindi ben al di sotto del 10% da te richiesto.

    Se poi con i metodi messi a disposizione da imageio riesci a fare tutto senza passare per file d'appoggio (sono convinto che si possa, d'altronde da una BufferedImage si parte comunque) meglio.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    102
    Originariamente inviato da Andrea1979
    con questo:
    codice:
    import javax.imageio.*;
    import javax.imageio.stream.*;
    import java.util.*;
    import java.io.*;
    import java.awt.image.*;
    
    /**
     *
     * @author Andrea
     */
    public class ImageIOTest {
        
        static String src = "C:/Users/Andrea/Desktop/imgtest/src.jpg";
        static String dest = "C:/Users/Andrea/Desktop/imgtest/dest.jpg";
        
        public static void main (String[] args) throws Exception {
            
            BufferedImage bimg = ImageIO.read(new File(src));        
            Iterator<ImageWriter> i = ImageIO.getImageWritersByFormatName("jpeg"); 
            
            // Just get the first JPEG writer available  
            ImageWriter jpegWriter = i.next();  
            
            // Set the compression quality to 0.1  
            ImageWriteParam param = jpegWriter.getDefaultWriteParam();  
            param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);  
            param.setCompressionQuality(0.1f); 
            
            // Write the image to a file 
            
            FileImageOutputStream out = new FileImageOutputStream(new File(dest));  
            jpegWriter.setOutput(out);  
            jpegWriter.write(null, new IIOImage(bimg, null, null), param);  
            jpegWriter.dispose();  
            out.close();         
        }
        
    }
    che altro non è che il codice di cui alla pagina che ti avevo linkato prima, ma con una compressione un po' più spinta, da una jpeg panoramica (4994 x 1008, 1.95MB) ottengo un file di circa 115KB, quindi ben al di sotto del 10% da te richiesto.

    Se poi con i metodi messi a disposizione da imageio riesci a fare tutto senza passare per file d'appoggio (sono convinto che si possa, d'altronde da una BufferedImage si parte comunque) meglio.
    Grazie! Adesso provo ad allegare questo codice (magari a 0.2f per una migliore qualità) con un resizing appropriato (dato che mi serve fare un resize dell'immagine per smartphone, quindi max a 1280x720) con magari pure una compressione di byte e dovrebbe uscire fuori una compressione perfetta! =)

    PS questo codice è buono per il resizing della BufferedImage?
    (Il metodo è createHeadlessBufferedImage())

    Compress

  10. #10
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    non penso che ad IIOImage interessi molto da dove arriva la RenderedImage (BufferedImage in questo caso, che la implementa) iniziale, basta che sia tale.

    Per il resizing BufferedImage eredita da Image getScaledInstance. Quindi dalla BufferedImage iniziale puoi tirarti fuori una BufferedImage ridimensionata e quindi applicare il resampling necessario a mantenere le dimensioni (peso) accettabili

    EDIT / AGGIUNTA
    ho visto il codice della pagina che hai linkato e mi sembra davvero tanta roba
    Prova magari con questo:

    http://pavel.tcholakov.net/2008/12/q...-java-imageio/

    EDIT 2: CODICE
    Combinando le due cose
    codice:
    public static void main (String[] args) throws Exception {
            
            BufferedImage bimg = ImageIO.read(new File(src));        
            Iterator<ImageWriter> i = ImageIO.getImageWritersByFormatName("jpeg"); 
            
            // Just get the first JPEG writer available  
            ImageWriter jpegWriter = i.next();  
            
            // Resize:
            Image thumbnail = bimg.getScaledInstance(bimg.getWidth()/4, -1, Image.SCALE_SMOOTH);
            BufferedImage bufferedThumbnail = new BufferedImage(
                    thumbnail.getWidth(null), 
                    thumbnail.getHeight(null),
                    BufferedImage.TYPE_INT_RGB
                    );
            
            bufferedThumbnail.getGraphics().drawImage(thumbnail, 0, 0, null);
            
            // Set the compression quality to 0.2  
            ImageWriteParam param = jpegWriter.getDefaultWriteParam();  
            param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);  
            param.setCompressionQuality(0.2f); 
            
            // Write the image to a file 
            
            FileImageOutputStream out = new FileImageOutputStream(new File(dest));  
            jpegWriter.setOutput(out);  
            //jpegWriter.write(null, new IIOImage(bimg, null, null), param);  
            jpegWriter.write(null, new IIOImage(bufferedThumbnail, null, null), param); 
            jpegWriter.dispose();  
            out.close();         
        }
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.