java - 写入 16 位 BufferedImage TYPE_USHORT_GRAY

标签 java image bufferedimage 16-bit

我正在尝试使用 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/

相关文章:

Java双缓冲——访问后像

java - GAE/J 数据存储 : storing null vs missing values

java - java.awt.Color.getColor(String colorName) 是如何工作的?

java - 在 Java 中覆盖具有通用返回类型的方法

java - 如何在 java 中调整 bufferedimage n graphics2d 的大小?

Java Swing BufferedImage 质量差

java - 使用 SPARK 从 zip 到 seq

jquery - CSS 图片库修改

android - 按多边形区域裁剪图像

html - CSS中心标题图片