来自 Java BufferedImage Raster 的不正确的灰度值

Incorrect grayscale values from Java BufferedImage Raster

我有一个灰度 height map,我在 Photoshop 中创建的,我需要将它传递给 Java 程序进行处理。我使用 ImageIO.read(...) 方法加载它,然后使用以下代码将其转换为灰度:

BufferedImage map = ImageIO.read(new File(...));
BufferedImage heightMap = new BufferedImage(map.getWidth(), map.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
heightMap.getGraphics().drawImage(map, 0, 0, null);
heightMap.getGraphics().dispose();

在 Photoshop 中,像素 (0,0) 的值为 17。当我使用 heightMap.getData().getSample(0, 0, 0)((byte[])(heightMap.getRaster().getDataElements(0, 0, null)))[0] & 0xff 时,我得到的值为 64。

有趣的是,当我运行map.getRGB(0, 0)>>16&0xFF时,我也得到了64的值。

如何解决这个问题并获得 17 的值?

谢谢。

导致此问题的原因是文件格式 (PNG)。在 Photoshop 中,我将 canvas 模式设置为灰度和 8 bits/channel。完成后,我将 image/height 地图保存为 PNG,这导致 Java 将图像加载为类型 0TYPE_CUSTOM 并导致灰度转换混乱,可能是由于透明度。

将图像保存为 JPEG 使得 Java 将图像直接加载为灰度 (TYPE_BYTE_GRAY) 并且 map.getData().getSample(0, 0, 0)((byte[])(map.getRaster().getDataElements(0, 0, null)))[0] & 0xff 返回值 13。不是完美值,但比 64 好很多。

P.S:不出所料,这次map.getRGB(0, 0)>>16&0xFF返回了错误的值64。