如何将Bufferedimage转换为索引类型,然后提取argb调色板

时间:2014-03-24 15:21:58

标签: java colors bufferedimage indices palette

我需要将BufferedImage转换为BufferedImage索引类型,以提取颜色数据和256色调色板的索引。 我认为我正在将BufferedImage转换为索引模式,然后使用下一个代码提取颜色索引:

BufferedImage paletteBufferedImage=new BufferedImage(textureInfoSubFile.getWidth(), textureInfoSubFile.getHeight(),BufferedImage.TYPE_BYTE_INDEXED);
paletteBufferedImage.getGraphics().drawImage(originalBufferedImage, 0, 0, null);

// puts the image pixeldata into the ByteBuffer
byte[] pixels = ((DataBufferByte) paletteBufferedImage.getRaster().getDataBuffer()).getData();          

我现在的问题是我需要知道每个颜色索引(调色板)的ARGB值以将它们放入数组中。我一直在阅读关于ColorModel和ColorSpace的内容,但我找不到一些方法来做我需要的。

2 个答案:

答案 0 :(得分:1)

最后我用这段代码解决了这个问题:

public static BufferedImage rgbaToIndexedBufferedImage(BufferedImage sourceBufferedImage) {
    //With this constructor we create an indexed bufferedimage with the same dimensiosn and with a default 256 color model
    BufferedImage indexedImage= new BufferedImage(sourceBufferedImage.getWidth(),sourceBufferedImage.getHeight(),BufferedImage.TYPE_BYTE_INDEXED);


    ColorModel cm = indexedImage.getColorModel();
    IndexColorModel icm=(IndexColorModel) cm;

    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);

    WritableRaster raster=indexedImage.getRaster();
    int pixel = raster.getSample(0, 0, 0); 
    IndexColorModel icm2 = new IndexColorModel(8, size, reds, greens, blues,pixel);
    indexedImage=new BufferedImage(icm2, raster,sourceBufferedImage.isAlphaPremultiplied(), null);
    indexedImage.getGraphics().drawImage(sourceBufferedImage, 0, 0, null);
    return indexedImage;
}

答案 1 :(得分:0)

我认为你的代码很好(除了你没有"把任何数据放到任何东西中,你只是引用数据缓冲区的后备数组,意味着{{1将反映到pixels,反之亦然)。

获取paletteBufferedImage中的索引的ARGB值:

pixels

有关详细信息,请参阅IndexColorModel课程文档。