我有一个灰度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?
感谢。
答案 0 :(得分:0)
此问题的原因是文件格式(PNG)。在Photoshop中,我将画布模式设置为灰度和8位/通道。完成后,我将图像/高度图保存为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。