写入16位BufferedImage TYPE_USHORT_GRAY
我正在尝试使用BufferedImage.TYPE_USHORT_GRAY将16位灰度imagedata写入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坐标)?
正如pst已经在我的问题下面评论过,我所要做的就是直接访问Raster。 问题解决了!
从BufferedImage
您可以阅读
public static final int TYPE_USHORT_GRAY
表示未签名的短灰度图像,非索引)。 此图像具有带有CS_GRAY ColorSpace的ComponentColorModel。
因此,尝试使用CS_GRAY
类型实例化您自己的ColorSpace
(我认为ColorSpace.getInstance(ColorSpace.CS_GRAY)
应该这样做)。 这个对象有一个名为fromRGB
的方法,您应该可以使用它…
您可能需要将已签名的16位短路加宽为整数并删除该符号:
int ushort = (int)(shortData[x][y]) & 0xFFFF;