2011-07-26 27 views
6

Si tengo una imagen PNG abierta como Imagen Buffered, ¿es posible reducir la paleta en la imagen PNG para que haya menos color (menos bits por píxel/profundidad de color)?PNG - ¿Es posible reducir la paleta usando Java 2D?

Por ejemplo, si nos fijamos en Colour depth en Wikipedia, me gustaría usar 16 colores en mi imagen PNG (3ra imagen en el lado derecho).

Si no es posible con Java 2D, ¿hay una biblioteca que me permita hacer esto de manera efectiva?

+0

http://stackoverflow.com/questions/87062/color-reduction- in-java –

+0

Eche un vistazo a las opciones provistas para PNGImageWriter en el código aquí: http://forums.oracle.com/forums/thread.jspa?messageID=5386868 – Rekin

Respuesta

7

creo Martijn Courteaux tenía razón:

comparison

Aquí es ejemplo de implementación:

import java.awt.Graphics2D; 
import java.awt.image.BufferedImage; 
import java.awt.image.IndexColorModel; 
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO; 

public class ImagingTest2 { 
    public static void main(String[] args) throws IOException { 
     BufferedImage src = ImageIO.read(new File("in.png")); // 71 kb 

     // here goes custom palette 
     IndexColorModel cm = new IndexColorModel(
       3, // 3 bits can store up to 8 colors 
       6, // here I use only 6 
       //   RED GREEN1 GREEN2 BLUE WHITE BLACK    
       new byte[]{-100,  0,  0, 0, -1,  0}, 
       new byte[]{ 0, -100, 60, 0, -1,  0}, 
       new byte[]{ 0,  0,  0, -100, -1,  0}); 

     // draw source image on new one, with custom palette 
     BufferedImage img = new BufferedImage(
       src.getWidth(), src.getHeight(), // match source 
       BufferedImage.TYPE_BYTE_INDEXED, // required to work 
       cm); // custom color model (i.e. palette) 
     Graphics2D g2 = img.createGraphics(); 
     g2.drawImage(src, 0, 0, null); 
     g2.dispose(); 

     // output 
     ImageIO.write(img, "png", new File("out.png")); // 2,5 kb 
    } 
} 
+1

La imagen reducida se ve terrible. Creo que 16 colores (distribuidos uniformemente) serían bastante mejores que tus 6 unidades. (Pero aún +1.) –

+0

Gracias, 16 colores romperían la sangría e introducirían barras de desplazamiento. : D – Rekin

+0

Esto funciona un encanto! ¿Puedes explicar por qué tienes los índices etiquetados '// ROJO VERDE1 VERDE2 AZUL BLANCO NEGRO' ¿Por qué tienes 'VERDE1' y 'VERDE2'? Gracias – Joeblackdev

2

Crea una nueva Imagen Buffered con la paleta inferior y usa createGraphic() para adquirir un objeto Graphics2D. Dibuja la imagen original en los gráficos. dispose() los gráficos y aquí está.

BufferedImage img = new BufferedImage(orig.getWidth(), orig.getHeight(), 
             BufferedImage.TYPE_USHORT_555_RGB); 
+1

Cómo definir el pálido colores de tte? – Pindatjuh

+0

¿Qué logrará esto? – Joeblackdev

+0

Ciertamente no mereces el voto en baja. Proporcioné mi respuesta para probarlo. – Rekin

Cuestiones relacionadas