写入16位BufferedImage TYPE_USHORT_GRAY

问题描述 投票:3回答: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坐标)?

java image bufferedimage 16-bit
3个回答
1
投票

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

尝试直接使用Raster?

直接访问Raster解决了这个问题。


0
投票

BufferedImage你可以阅读

public static final int TYPE_USHORT_GRAY

表示未签名的短灰度图像,非索引)。此图像具有带有CS_GRAY ColorSpace的ComponentColorModel。

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


0
投票

您可能需要将已签名的16位短路加宽为整数并删除该符号:

int ushort = (int)(shortData[x][y]) & 0xFFFF;
© www.soinside.com 2019 - 2024. All rights reserved.