使用调色板从 TIFF 获取像素颜色索引

Are*_*iak 2 java tiff colors jai color-palette

我有TIFF256 字节的调色板。在Java中我读这TIFFBufferedImage。这BufferedImageIndexColorModel. 当我遍历 中的像素时BufferedImage,我只能得到 RGB。我想编写方法,用于x,y从调色板中获取原始颜色索引BufferedImage(不是 RGB 颜色,只是来自TIFFs 调色板的原始索引)。我怎样才能做到这一点?

我知道我可以遍历 IndexColorModel 并检查 RBG 相等性,但是如果TIFF至少有 2 个具有相同颜色的索引(例如索引 0 - 黑色、132 - 黑色;假设像素 10x10 具有黑色[rgb=0,0,0]- 那么我不知道我应该采用哪个索引 - 它们具有相同的 RGB 值)。我也可以读取原始数据TIFF,然后计算字节数组中的像素位置,但我不想这样做 - 我想使用JAI.

有没有办法在有BufferedImageJAI没有外部库的情况下做到这一点?

谢谢

Mar*_*o13 5

OK,那么你就可以得到

  • 来自 BufferedImage 的 Raster
  • 来自 Raster 的 DataBuffer
  • 来自 DataBuffer 的数据数组

并从该数据数组中获取实际使用的索引。

本示例读取索引,在颜色模型中查找相应的颜色,并将结果写入“标准”BufferedImage(仅作为验证)

import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.DataBuffer;
import java.awt.image.DataBufferByte;
import java.awt.image.IndexColorModel;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

public class IndexedBufferedImage
{
    public static void main(String[] args) throws IOException
    {
        BufferedImage image = ImageIO.read(new File("exampleTiff256.tif"));
        System.out.println(image);
        System.out.println(image.getColorModel());

        ColorModel colorModel = image.getColorModel();
        IndexColorModel indexColorModel = null;
        if (colorModel instanceof IndexColorModel)
        {
            indexColorModel = (IndexColorModel)colorModel;
        }
        else
        {
            System.out.println("No IndexColorModel");
            return;
        }

        DataBuffer dataBuffer = image.getRaster().getDataBuffer();
        DataBufferByte dataBufferByte = null;
        if (dataBuffer instanceof DataBufferByte)
        {
            dataBufferByte = (DataBufferByte)dataBuffer;
        }
        else
        {
            System.out.println("No DataBufferByte");
            return;
        }

        int w = image.getWidth();
        int h = image.getHeight();
        BufferedImage test = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
        byte data[] = dataBufferByte.getData();
        for (int y=0; y<h; y++)
        {
            for (int x=0; x<w; x++)
            {
                int arrayIndex = x + y * w;
                int colorIndex = data[arrayIndex];
                int color = indexColorModel.getRGB(colorIndex);
                System.out.println("At "+x+" "+y+" index is "+colorIndex+
                    " with color "+Integer.toHexString(color));
                test.setRGB(x, y, color);
            }
        }
        ImageIO.write(test, "PNG", new File("exampleTiff256.png"));
    }
}
Run Code Online (Sandbox Code Playgroud)