将灰度图像像素转换为定义的比例

时间:2014-09-17 00:14:11

标签: java heightmap

我希望使用我在Photoshop中创建的非常粗糙的高度图来为我定义平铺等距网格:

地图: http://i.imgur.com/jKM7AgI.png

我的目标是遍历图像中的每个像素,并将该像素的颜色转换为我选择的比例,例如0-100。

目前我正在使用以下代码:

    try
    {
        final File file = new File("D:\\clouds.png");
        final BufferedImage image = ImageIO.read(file);

        for (int x = 0; x < image.getWidth(); x++) 
        {
            for (int y = 0; y < image.getHeight(); y++) 
            {
                int clr = image.getRGB(x, y) / 99999;
                if (clr <= 0)
                    clr = -clr;

                System.out.println(clr);        
            }
        }
    }
    catch (IOException ex)
    {
         // Deal with exception
    }

这在一定程度上起作用;位置0处的黑色像素是167,位置999处的白色像素是0.然而,当我将某些像素插入图像时,我得到略微奇怪的结果,例如,非常接近白色的灰色像素返回超过100当我希望它是一位数时。

我是否可以使用可以产生更可靠结果的替代解决方案?

非常感谢。

2 个答案:

答案 0 :(得分:1)

getRGB返回打包到一个int的所有频道,因此您不应该使用它进行算术运算。也许使用RGB矢量的范数?

for (int x = 0; x < image.getWidth(); ++x) {
    for (int y = 0; y < image.getHeight(); ++y) {
        final int rgb = image.getRGB(x, y);
        final int red   = ((rgb & 0xFF0000) >> 16);
        final int green = ((rgb & 0x00FF00) >>  8);
        final int blue  = ((rgb & 0x0000FF) >>  0);
        // Norm of RGB vector mapped to the unit interval.
        final double intensity =
            Math.sqrt(red * red + green * green + blue * blue)
            / Math.sqrt(3 * 255 * 255);
    }
}

请注意,还有java.awt.Color类可以使用int返回的getRGB进行实例化,并提供getRedgetGreen和{{1如果您不想自己进行位操作,请使用方法。

答案 1 :(得分:1)

由于它是一个灰度图,RGB部分将全部是相同的值(范围0 - 255),所以只需从打包的整数中取出一个,找出它的255%:

int clr = (int) ((image.getRGB(x, y) & 0xFF) / 255.0 * 100);

System.out.println(clr);