来自 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 将图像加载为类型 0 或 TYPE_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。
我有一个灰度 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 将图像加载为类型 0 或 TYPE_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。