我需要将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的内容,但我找不到一些方法来做我需要的。
答案 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课程文档。