3

我正在尝试使用 BufferedImage.TYPE_USHORT_GRAY 将 16 位灰度图像数据写入 png。通常我写这样的图像:

BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);

然后:

image.setRGB(x,y,Color.getRGB);

设置像素,最后:

ImageIO.write(image, "png", new File(path + ".png"));

写入 png 图像。

但现在我有这个作为图像:

BufferedImage imageGray = new BufferedImage(width, height, BufferedImage.TYPE_USHORT_GRAY);

如何将像素保存为该格式?使用带有 16 位整数的 setRGB() 似乎不起作用,当我打开保存的 png 文件时,我看到很多条带发生。

我尝试保存从 0 到 65535 的简单渐变,然后在灰度图像上使用 setRGB(),并在 Photoshop 中检查结果。我可以看到图像每 256 行包含较小的渐变。我猜 setRGB() 或 imageIO 不能像我希望的那样工作。

有解决方法吗?imageIO 甚至支持 BufferedImage.TYPE_USHORT_GRAY 格式吗?还是只能保存8位数据?如果它可以保存 16 位数据,我将如何保存像素数据,最好以 setRGB() 的方式工作(所以对于某个 x,y 坐标)?

4

3 回答 3

2

正如 pst 已经在我的问题下面评论过的那样:

尝试直接使用光栅?

访问光栅直接解决了这个问题:

BufferedImage bi = BufferedImage(width, height, BufferedImage.TYPE_USHORT_GRAY)
for (int x = 0; x < width; x++) {
    for (int y = 0; y < height; y++) {
        Short s = shortData[x][y]
        bi.getRaster().setDataElements(x, y, Short[] {s})
    }
}
于 2011-02-15T20:04:03.540 回答
0

您可能需要将已签名的 16 位短裤扩大到整数并删除符号:

int ushort = (int)(shortData[x][y]) & 0xFFFF;
于 2010-11-07T10:01:49.073 回答
0

BufferedImage你可以阅读

公共静态最终 int TYPE_USHORT_GRAY

表示无符号短灰度图像,非索引)。此图像有一个带有 CS_GRAY 颜色空间的 ComponentColorModel。

ColorSpace所以尝试用类型实例化你自己的CS_GRAYColorSpace.getInstance(ColorSpace.CS_GRAY)我想应该这样做)。这个对象有一个方法叫fromRGB你应该可以使用...

于 2010-11-07T08:17:54.913 回答