2

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

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

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

谢谢

4

1 回答 1

5

OK,那么就可以获得

  • 来自 BufferedImage 的光栅
  • 来自光栅的 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"));
    }
}
于 2014-02-13T15:21:31.093 回答