0

我正在寻找使用我在 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,而我期望它是个位数。

有没有我可以使用的替代解决方案来产生更可靠的结果?

非常感谢。

4

2 回答 2

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来实例化类。intgetRGBgetRedgetGreengetBlue

于 2014-09-17T00:29:56.387 回答
1

由于它是灰度图,RGB 部分都是相同的值(范围为 0 - 255),所以只需从压缩整数中取出一个,找出 255 的百分比:

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

System.out.println(clr);        
于 2014-09-17T00:42:56.500 回答