我希望使用我在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当我希望它是一位数时。
我是否可以使用可以产生更可靠结果的替代解决方案?
非常感谢。
答案 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
进行实例化,并提供getRed
,getGreen
和{{1如果您不想自己进行位操作,请使用方法。
答案 1 :(得分:1)
由于它是一个灰度图,RGB部分将全部是相同的值(范围0 - 255),所以只需从打包的整数中取出一个,找出它的255%:
int clr = (int) ((image.getRGB(x, y) & 0xFF) / 255.0 * 100);
System.out.println(clr);