【问题标题】:How do I retrieve 16 bit pixel data from a tiff in Java?如何从 Java 中的 tiff 检索 16 位像素数据?
【发布时间】:2011-03-06 22:31:12
【问题描述】:

我正在编写一个程序,它将对 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位值]时应该是6168,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 位图像格式这一事实,我只能假设这是可能的,但我对我缺少的东西感到困惑.

【问题讨论】:

  • 你是如何从 TIFF 中获得BufferedImage 的???

标签: java image-processing tiff


【解决方案1】:

问题在于 raster.getPixel(x, y, pixelColor);以 8 位返回每个 RGB 值(在我的测试图像中,0,0 像素值在应为 6168,6168,6168 [16 位值]时返回为 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)

【讨论】:

  • 你是对的。我肯定将每个通道的 5-6-5 位混淆为每个通道 16 位,而不是总共只有 16 位,因此 3、6、3 RGB 值对于该颜色模型是正确的。感谢您指出我的结论中的缺陷并帮助我修复我的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-02
相关资源
最近更新 更多