代码之家  ›  专栏  ›  技术社区  ›  Peter

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

  •  0
  • Peter  · 技术社区  · 15 年前

    我正在编写一个程序,该程序将对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值(在我的测试图像中,0,0像素值返回为24,24,24[8位值],此时应为616861686168[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);
    

    但这次, graster.getpixel(x,y,pixelcolor); returns 3,6,3 which isn't correct either.

    基于IMAGEIO支持TIFF图像和缓冲图像具有5-6-5样式的16位图像格式这一事实,我只能假设这是可能的,但我对我所缺少的感到困惑。

    1 回复  |  直到 15 年前
        1
  •  2
  •   user113476    15 年前

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

    那句话不正确。

    每像素16位 平均每红、绿、蓝值16位。它意味着16位代表R、G和B的组合值。

    所以一个16位的短值可以被分解来表示 像素。

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

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

    合并后得到1011110101011100二进制或48476十进制。

    从未在爪哇编码过,我怀疑你需要使用一个不同的函数调用来获得你要找的值。也许可以尝试[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.