Как преобразовать Bufferedimage в индексированный тип, а затем извлечь цветовую палитру argb

Мне нужно преобразовать 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, но не нашел способов сделать то, что мне нужно.


person Jorge    schedule 24.03.2014    source источник
comment
тестируя мой код, я увидел, что преобразование пропускает прозрачность, и мне нужно сохранить ее   -  person Jorge    schedule 24.03.2014


Ответы (2)


Я думаю, что ваш код хорош (за исключением того, что вы не «помещаете» данные ни во что, вы просто ссылаетесь на резервный массив буфера данных, что означает, что изменения в pixels отразятся на paletteBufferedImage и наоборот).

Чтобы получить значения ARGB для индексов в pixels:

IndexColorModel indexedCM = (IndexColorModel) paletteBufferedImage.getColorModel(); // cast is safe for TYPE_BYTE_INDEXED
int[] palette = new int[indexedCM.getMapSize()]; // Allocate array
indexedCM.getRGBs(palette); // Copy palette to array (ARGB values)

Дополнительные сведения см. в разделе IndexColorModel. документация класса.

person Harald K    schedule 25.03.2014

Наконец, я решаю это с помощью этого кода:

public static BufferedImage rgbaToIndexedBufferedImage(BufferedImage sourceBufferedImage) {
    // With this constructor, we create an indexed buffered image with the same dimension 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;
}
person Jorge    schedule 26.03.2014