2010-04-27 26 views
11

Ciao Vorrei sapere se c'è un modo in Java per ridurre la dimensione di un'immagine (utilizzare qualsiasi tipo di compressione) che è stata caricata come BufferedImage e che verrà salvata come un PNG.come comprimere un'immagine PNG utilizzando Java

Forse una specie di png imagewriteparam? Non ho trovato nulla di utile quindi sono bloccato.

heres un esempio di come l'immagine viene caricata e salvato

public static BufferedImage load(String imageUrl) {   
    Image image = new ImageIcon(imageUrl).getImage(); 
    bufferedImage = new BufferedImage(image.getWidth(null), 
                image.getHeight(null), 
                BufferedImage.TYPE_INT_ARGB); 
    Graphics2D g2D = bufferedImage.createGraphics(); 
    g2D.drawImage(image, 0, 0, null); 
    return bufferedImage; 
} 

public static void storeImageAsPng(BufferedImage image, String imageUrl) throws IOException { 
    ImageIO.write(image, "png", new File(imageUrl)); 
} 
+0

"Qualsiasi tipo di compressione" include la compressione con perdita? Perché quindi memorizzare l'immagine in formato JPEG potrebbe far risparmiare molto spazio. –

+0

PNG è un formato di compressione senza perdita di dati (purché l'immagine sorgente non usi più di 8 bit per canale: se si converte, per esempio, un'immagine RGB a 48 bit in PNG, il PNG diventa lossy), quindi non è possibile guadagna molto Esistono tuttavia molti strumenti che producono PNG molto più piccoli del solito e sono particolarmente utili se avete bisogno dei vostri PNG per dispositivi con limitazioni di memoria: PNGOUT è uno strumento di questo tipo ed è stato programmato da uno dei programmatori migliori di sempre: http: //advsys.net/ken/utils.htm#pngout – SyntaxT3rr0r

+0

giusto, come ha chiesto Joachim, nessuna compressione con perdita di dati, solo ridurre la dimensione del file immagine come usato da zip e così via e non ci dovrebbero essere strumenti esterni come PNGOUT, quindi potrebbe essere una sorta di libreria che supporta e ImageWriteParam per PNG come JPEGImageWriteParam, guardando xmlgraphics-commons 1.3.1 atm. Scusate se mi sto confondendo in alcune parti sono ancora un novizio, solo che le risposte potrebbero aiutarmi o ispirare altre persone con un problema simile. Grazie per i suggerimenti finora. – ubernoob

risposta

1

Dai un'occhiata alla classe ImageWriterParam nello stesso pacchetto della classe ImageIO. Menziona la compressione.

https://docs.oracle.com/javase/7/docs/api/javax/imageio/ImageWriteParam.html

veda anche l'esempio a http://exampledepot.com/egs/javax.imageio/JpegWrite.html e vedere se si traduce bene per i file PNG.

+2

Genera un'eccezione se si desidera utilizzare la modalità di compressione esplicita per i PNG che informa che questo non è supportato per questo formato. Quindi i parametri applicati a JpegWriter non sono applicati a PNG. –

2

Se it's going to be saved as PNG, la compressione verrà eseguita in quella fase. PNG ha un algoritmo di compressione senza perdita di dati (fondamentalmente predizione seguita dalla compressione lempel-ziv) con pochi parametri regolabili (tipi di "filters") e poco impatto nella quantità di compressione - in generale l'impostazione predefinita sarà ottimale.

+1

Da quanto ho letto su gimp png-save options, il livello di compressione (un'impostazione da 1 a 9) determina la compressione (sforzo dell'encoder), sebbene sia privo di perdite, indipendentemente da ciò che si imposta. – aioobe

+0

Sì, è solo una questione di scegliere uno dei quattro 'filtri' (in realtà predittori, vedi sopra il link) da usare, magari usando filtri distinti per linee diverse. È sempre senza perdite. – leonbloy

2

Si consiglia di provare pngtastic. È un ottimizzatore di immagini png java puro che può ridursi in una certa misura.

Problemi correlati