如何从Java中的tiff中检索16位像素数据?

时间:2010-06-22 17:00:28

标签: java image-processing tiff

我正在编写一个程序,它将对16位tiff图像(5位红色,6位绿色,5位蓝色)进行图像处理,但遗憾的是我写的代码将图像数据视为8位。

为了详细说明代码,我使用ImageIO实用程序类将图像读入内存,如下所示:

BufferedImage image = ImageIO.read(imageFile);

以后再使用此循环来检索像素信息:

Matrix imageMatrix = new Matrix(image.getHeight(), image.getWidth());
Raster raster = image.getData();
double[] pixelColor = new double[4];
for (int x = 0; x < image.getWidth(); x = x + 1) {
    for (int y = 0; y < image.getHeight(); y = y + 1) {
        raster.getPixel(x, y, pixelColor);
        double pixelColorAverage = (pixelColor[0] + pixelColor[1] + pixelColor[2]) / 3.0;
        imageMatrix.set(y, x, pixelColorAverage);
    }
}
return imageMatrix;

问题是raster.getPixel(x, y, pixelColor);以8位返回每个RGB值(在我的测试图像中,当它应该是6168时,0,0像素值返回为24,24,24 [8位值], 6168,6168 [16位值])。

我尝试将简单化的ImageIO.read(imageFile)更改为基于另一个stack overflow tiff question的以下代码行:

BufferedImage image = ImageIO.read(file);
BufferedImage convertedImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_USHORT_565_RGB);
convertedImage.createGraphics().drawRenderedImage(image, null);

但这一次,raster.getPixel(x, y, pixelColor);返回3,6,3也不正确。

基于ImageIO支持tiff图像和缓冲图像具有5-6-5样式16位图像格式这一事实,我只能假设这是可能的,但我很难过我错过了什么

1 个答案:

答案 0 :(得分:2)

  
    

问题是raster.getPixel(x,y,pixelColor);以8位返回每个RGB值(在我的测试图像中,当应该是6168,6168,6168 [16位值]时,0,0像素值返回为24,24,24 [8位值])。

  

该陈述不正确。

每像素16位表示每个红色或绿色或蓝色值16位。这意味着16位表示组合的R和G和B值。

因此可以分解16位短值来表示一个像素。

5位表示红色值。 6位代表绿色值。 5位代表蓝色值。

Red   Green  Blue
----- ------ -----
10111 101010 11100

组合你获得1011110101011100二进制或48476十进制。

从未使用Java编码,我怀疑您需要使用不同的函数调用来获取您正在寻找的值。也许尝试[getDataElements] [1]来获得相关像素的16位值。

记住,每个像素都是16位。你很困惑24位(每个像素是8位)或32位(每个像素是8位加上8位alpha值。)

This article from MSDN should help you retreive the RGB values from the 16 bit value.

(您还必须更正平均代码。)

[1]:http://java.sun.com/j2se/1.4.2/docs/api/java/awt/image/Raster.html#getDataElements(int,int,java.lang.Object)