来自Java BufferedImage Raster

时间:2017-02-11 13:33:54

标签: java pixel bufferedimage raster grayscale

我有一个灰度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?

感谢。

1 个答案:

答案 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。