我想找到 MyImage(扩展 BufferedImage)的平均红色 RGB 值。我将图像中每个像素的红色值保存到数组 red[] 中。最后我想对这些求和以找到红色的平均值。但是当我在 MyImage 上运行这段代码时,它只打印 0。我怎样才能让这个方法正常工作? (此处未包含的代码也可以正常工作)
public class MyImage extends BufferedImage {
public MyImage(int width, int height, int imageType) {
super(width, height, imageType);
}
public void findAverageRedValue(){
int height = this.getHeight();
int width = this.getWidth();
int[] red = new int[height*width];
Map m = new HashMap();
for(int i=0; i < width ; i++)
{
for(int j=0; j < height ; j++)
{
ColorModel colorModel = this.getColorModel();
int rCol = colorModel.getRed(j*i);
red[red.length - 1] = rCol;
}
}
int sum = 0;
for(int i = 0; i < red.length; i++)
sum += red[i];
int averageRed = sum/red.length;
System.out.println(averageRed);
}
}
最佳答案
您将数组的元素分配为:
red[red.length - 1] = rCol;
在每种可能的情况下,这将仅分配数组的最后一个元素。数组的 length 属性与集合的 size()
不同;它是一个静态值,基于数组的初始化维度。
因此,除了一个数组条目外,所有条目都将为零。因此,最后,sum
将介于 0 到 255 之间 - 当除以一个(可能)更大的数字时,结果为零。 (这里可能存在问题,因为您正在进行整数除法,但这可能并不重要)。
要解决此问题,您需要更改分配给的数组索引。您可以为数组索引保留一个单独的计数器 - 或者,利用现有的 i
和 j
来执行以下操作:
red[i * width + j] = rCol;
无论哪种方式,这都会将每个像素的红色分量放入单独的数组位置,从而使您能够正确地对它们求和。
Integer division是 Java 中的一个潜在问题,这就是您最后要做的事情。通过 sum/(float)red.length
获得小数平均值可能会更好,但只要您知道发生了什么并且您很高兴截断为最接近的整数,这可能不会有必要。
关于java - 查找 BufferedImage 中红色的平均值 (Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14601886/