2010-04-27 38 views
11

Hola, me gustaría saber si hay alguna forma en Java para reducir el tamaño de una imagen (utilizar cualquier tipo de compresión) que se cargó como una Imagen Buffered y se va a guardar como PNG.cómo comprimir una imagen PNG usando Java

Tal vez algún tipo de png imagewriteparam? No encontré nada útil, así que estoy atascado.

aquí está una muestra de cómo se carga la imagen y se guarda

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

¿Hay "algún tipo de compresión" que incluya compresión con pérdida? Porque entonces, almacenar la imagen en formato JPEG puede ahorrar mucho espacio. –

+0

PNG es un formato de compresión sin pérdida (siempre que la imagen de origen no use más de 8 bits por canal: si convierte, por ejemplo, una imagen RGB de 48 bits en PNG, PNG se vuelve con pérdida) por lo tanto, no puede ganar mucho Sin embargo, hay muchas herramientas que producen PNG mucho más pequeñas que lo habitual, y son particularmente útiles si necesita sus PNG para dispositivos con memoria limitada: PNGOUT es una herramienta así y fue programado por uno de los mejores programadores de todos los tiempos: http: //advsys.net/ken/utils.htm#pngout – SyntaxT3rr0r

+0

a la derecha, como pidió Joachim, sin compresión con pérdida, solo reduce el tamaño del archivo de imagen como lo usa zip y eso y no debería haber herramientas externas involucradas como PNGOUT, entonces podría ser algún tipo de biblioteca que admita ImageWriteParam para PNG como JPEGImageWriteParam, mirando xmlgraphics-commons 1.3.1 atm. Lo siento si me estoy volviendo confuso en algunas partes todavía soy un novato, solo que las respuestas podrían ayudarme o inspirar a otras personas con un problema similar. Gracias por las sugerencias hasta ahora. – ubernoob

Respuesta

1

Tener un vistazo a la clase ImageWriterParam en el mismo paquete que la clase ImageIO. Menciona compresión.

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

estudian también el ejemplo en http://exampledepot.com/egs/javax.imageio/JpegWrite.html y ver si se traduce bien para los archivos PNG.

+2

Lanzará una excepción si desea utilizar el modo de compresión explícito para PNG que le informa que esto no es compatible con este formato. Entonces los parámetros aplicados a JpegWriter no se aplican a PNG. –

2

Si it's going to be saved as PNG, la compresión se realizará en esa etapa. PNG tiene un algoritmo de compresión sin pérdida (básicamente predicción seguido de compresión lempel-ziv) con pocos parámetros ajustables (tipos de "filters") y no tiene mucho impacto en la cantidad de compresión; en general, el valor predeterminado será óptimo.

+1

Según lo que he leído sobre las opciones de gimps png-save, el nivel de compresión (un ajuste de 1 a 9) determina la compresión (esfuerzo del codificador), aunque no tiene pérdida, independientemente de lo que establezca. – aioobe

+0

Sí, es solo una cuestión de elegir uno de los cuatro "filtros" (en realidad, predictores, ver el enlace de arriba) para usar, tal vez usando filtros distintos para diferentes líneas. Siempre es sin pérdida. – leonbloy

2

Es posible que desee intentar pngtastic. Es un optimizador de imagen png java puro que puede reducir imágenes de PNG hasta cierto punto.

Cuestiones relacionadas