2012-06-16 16 views
8

Estaba mirando la clase ImageConverter, tratando de ver cómo convertir una imagen BufferedImage a 8 bits, pero no tengo idea de cómo iba a hacer esto. También buscaba por Internet y no encontré una respuesta simple, todos hablaban de imágenes en escala de grises de 8 bits. Simplemente quiero convertir los colores de una imagen a 8 bits ... nada más, no cambiar el tamaño sin nada. ¿Alguien le importa decirme cómo hacer esto?Cómo convertir una imagen Buffered a 8 bit?

+0

es probable que tenga que elegir un algoritmo de cuantificación, es decir. algo que transforma el rango de colores de sus imágenes en una paleta de 256 entradas. – PhiLho

+0

¿A qué te refieres con convertir los colores de una imagen a 8 bits? Supongo que quieres reducir el espacio de color? ¿Desea realizar la cuantización del color? – Behe

+0

¿Podrían apuntarme a una biblioteca/API de algún tipo? No tengo idea de lo que estás hablando. Eso también parece que podría crear mi propia paleta, que sería mejor si fuera posible. –

Respuesta

2

Este fragmento de código del artículo de "Transparent gifs in Java" at G-Man's Uber Software Engineering Blog funciona bien:

public static void main(String[] args) throws Exception { 
    BufferedImage src = convertRGBAToIndexed(ImageIO.read(new File("/src.jpg"))); 
    ImageIO.write(src, "gif", new File("/dest.gif")); 
} 

public static BufferedImage convertRGBAToIndexed(BufferedImage src) { 
    BufferedImage dest = new BufferedImage(src.getWidth(), src.getHeight(), BufferedImage.TYPE_BYTE_INDEXED); 
    Graphics g = dest.getGraphics(); 
    g.setColor(new Color(231, 20, 189)); 

    // fill with a hideous color and make it transparent 
    g.fillRect(0, 0, dest.getWidth(), dest.getHeight()); 
    dest = makeTransparent(dest, 0, 0); 

    dest.createGraphics().drawImage(src, 0, 0, null); 
    return dest; 
} 

public static BufferedImage makeTransparent(BufferedImage image, int x, int y) { 
    ColorModel cm = image.getColorModel(); 
    if (!(cm instanceof IndexColorModel)) 
     return image; // sorry... 
    IndexColorModel icm = (IndexColorModel) cm; 
    WritableRaster raster = image.getRaster(); 
    int pixel = raster.getSample(x, y, 0); // pixel is offset in ICM's palette 
    int size = icm.getMapSize(); 
    byte[] reds = new byte[size]; 
    byte[] greens = new byte[size]; 
    byte[] blues = new byte[size]; 
    icm.getReds(reds); 
    icm.getGreens(greens); 
    icm.getBlues(blues); 
    IndexColorModel icm2 = new IndexColorModel(8, size, reds, greens, blues, pixel); 
    return new BufferedImage(icm2, raster, image.isAlphaPremultiplied(), null); 
} 
+0

Funcionó muy bien, solo tuvo que quitar la parte de transparencia. –

1

Puede usar el método convert8 en la clase ConvertUtil.

Para los detalles echar un vistazo here.

+0

No pude usar ConvertUtil.convert8, así que tendría que importar esa clase, pero no pude encontrar el código de importación. ¿Por casualidad haces qué/dónde está? – Dak31

4

Puede usar JAI (Java Advanced Imaging), la biblioteca oficial de imágenes de Sun (ahora Oracle) para hacer eso.

El ColorQuantizerDescriptor muestra la elección de los procesos de cuantificación que puede aplicar.

+0

¿Tiene algún código de muestra? http://stackoverflow.com/questions/15312921/how-to-use-colorquantizerdescriptor –

Cuestiones relacionadas