我正在尝试使用 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 文件时,我看到很多 strip 发生。
我尝试保存一个从 0 到 65535 的简单渐变,然后在灰度图像上使用 setRGB(),并在 Photoshop 中检查结果。我可以看到图像每 256 行由较小的渐变组成。我猜测 setRGB() 或 imageIO 无法正常工作。
有解决办法吗? imageIO 甚至支持 BufferedImage.TYPE_USHORT_GRAY 格式吗?还是只能保存8位数据?如果它可以保存 16 位数据,我将如何保存像素数据,最好以 setRGB() 之类的方式工作(因此对于某个 x,y 坐标)?
最佳答案
正如 pst 已经在我的问题下方评论的那样:
Try using the Raster directly?
直接访问栅格解决了问题:
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})
}
}
关于java - 写入 16 位 BufferedImage TYPE_USHORT_GRAY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4116858/