Java - зацикливание на средних значениях rgb должно разрушать вещи .... но не - PullRequest
0 голосов
/ 12 декабря 2018

Итак, у меня есть школьный проект, и мы должны поработать с парой классов, которые дал нам наш профессор, и создать свои собственные, чтобы сделать органайзер изображений.

Первая часть состоит из создания набора статических изображений.методы для редактирования самих изображений в виде двумерных массивов цветовых массивов (тип ColorImage).

Первая первая проблема заключается в создании инструмента для уменьшения масштаба изображения с коэффициентом f (f-сторонний квадрат пикселей в оригинале становится1 пиксель на выходе), и мой работает, но я думаю, что это не должно, и я не могу понять, почему это работает, поэтому любая помощь приветствуется.В частности, я рассматриваю цикл, который усредняет цвета каждой позиции в массиве буферов (avgArr [] []) (строка 16).Я думаю: значение красного, синего и зеленого будет просто перезаписываться для каждой итерации, а avgColor просто получит значение последнего пикселя, в котором он получил значения rgb от avgArr.

    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 голосов
/ 12 декабря 2018

Я думаю, что вы можете решить вашу проблему, суммируя красные / зеленые / синие цвета, а затем разделив их на общее количество пикселей в конце, чтобы найти среднее значение:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...