Java-循环到平均rgb值应该会破坏东西....但不是

时间:2018-12-12 17:12:36

标签: java arrays loops

所以我有一个学校项目,我们需要教授教授给我们的几节课,然后自己做一个图像组织者。

第一部分包括一组静态方法,以将图像本身编辑为Color数组(ColorImage类型)的2D数组。

第一个第一个问题是制作一个将图像缩小f倍的工具(原始像素的f平方像素在输出中变为1像素),而我的作品可行,但我认为不行,我无法弄清楚它为什么起作用,因此不胜感激。具体来说,我正在考虑对缓冲区数组(avgArr [] [])中每个位置的颜色求平均的循环(第16行)。我在想:每次迭代都会覆盖红色,蓝色和绿色的值,而avgColor只会获取最后一个像素的值,而该像素会从avgArr中获取rgb值。

    static ColorImage downscaleImg(ColorImage img, int f) {

    ColorImage dsi = new ColorImage(img.getWidth()/f, img.getHeight()/f);
    Color[][] avgArr = new Color[f][f];
    int reds = 0;
    int greens = 0;
    int blues = 0;

    for(int i = 0; i < dsi.getWidth(); i++) {
        for(int j = 0; j < dsi.getHeight(); j++) {
            for(int x = i*f, xc = 0; x < i*f + (f-1); x++, xc++){
                for(int y = j*f, yc = 0; y < j*f + (f-1); y++, yc++) {
                    avgArr[xc][yc] = img.getColor(x, y);
                }
            }
            for(int k = 0; k < f - 1; k++){
                for(int w = 0; w < f - 1; w++) {
                    reds += avgArr[k][w].getR();
                    greens += avgArr[k][w].getG();
                    blues += avgArr[k][w].getB();
                }
            }
            int count = f*f;
            Color avgColor = new Color(reds/count, greens/count, blues/count);
            dsi.setColor(i, j, avgColor);
            reds = 0;
            greens = 0;
            blues = 0;
        }
    }
    return dsi;
}

谢谢

编辑:事实证明,它实际上只是取了它所看的avgArr的最后一个位置的颜色。欢迎提出任何纠正建议。

1 个答案:

答案 0 :(得分:1)

我认为您可以通过以下方法解决问题:对红色/绿色/蓝色进行求和,然后将其除以最后的总像素,即可得出平均值:

int reds = 0;
int greens = 0;
int blues = 0;

...

        for(int k = 0; k < f - 1; k++){
            for(int w = 0; w < f - 1; w++) {
                reds += avgArr[k][w].getR();    // <-- note the +=
                greens += avgArr[k][w].getG();
                blues += avgArr[k][w].getB();
            }
        }

        int count = (f-1)*(f-1);
        Color avgColor = new Color(reds/count, greens/count, blues/count);