【问题标题】:Finding the average value of the color red in a BufferedImage (Java)在 BufferedImage (Java) 中查找红色的平均值
【发布时间】:2013-01-30 10:35:09
【问题描述】:

我想找到 MyImage(扩展 BufferedImage)的平均红色 RGB 值。我将图像中每个像素的红色值保存到数组 red[] 中。最后,我想将这些 ut 相加以找到红色的平均值。但是当我在 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);
    }        
}

【问题讨论】:

    标签: java rgb


    【解决方案1】:

    您将数组的元素分配为:

    red[red.length - 1] = rCol;
    

    在所有可能的情况下,这将只分配数组的最后一个元素。数组的长度属性不像集合的size();它是一个静态值,基于数组的初始化维度。

    因此,除了一个数组条目之外的所有条目都将为零。因此,最后,sum 将介于 0 和 255 之间 - 当除以(可能)更大的数字时,结果为零。 (这里可能存在一个问题,即您正在执行整数除法,但这可能并不重要)。

    要解决此问题,您需要更改分配给的数组索引。您可以为数组索引保留一个单独的计数器 - 或者,利用现有的 ij 来做:

    red[i * width + j] = rCol;
    

    无论哪种方式,这都会将每个像素的红色分量放入一个单独的数组位置,从而使您能够正确地对它们求和。

    Integer division 是 Java 中的一个潜在问题,这就是你最后要做的。通过sum / (float)red.length 获取小数平均值可能会更好,但只要您知道发生了什么并且您乐于截断到最接近的整数,这可能没有必要。

    【讨论】: