Вложен для хранения цикла в массиве, давая только один столбец вложенного цикла в массив - PullRequest
0 голосов
/ 13 апреля 2011

Итак, я пытаюсь выполнить рисунок размером 1024x768 (или popMap.getWidth x popMap.getHeight), возьмите его синий цвет, сравните его с самым высоким синим цветом, и еслиболее того, синий становится новым «новым синим».По сути, найдите самое высокое значение синего цвета в изображении, самое близкое к 255 синему.

Также я пытаюсь сохранить значение синего целого в массиве popMapArray, который представляет собой двумерный массив с 3 столбцами., сохраняя [blueValue] [x] [y].Который я тогда сортирую, чтобы получить список от высокого до низкого из самых синих значений.

Моя проблема в том, что с приведенным ниже кодом он сохраняется в массив только при столбце = 767.

Я получаю 1024 [синий, строка, 767], а затем все остальные[0,0,0]

Любая подсказка, почему?Ява, кстати.

for (int row = 0;  row < popMap.getWidth(); row++) 
    {
        for (int column = 0; column < popMap.getHeight(); column++)
        {
            System.out.println(column);
            //Find a Pixel
            int c = popMap.getRGB(row, column);
            int red = (c & 0x00ff0000) >> 16;
            //int  green = (c & 0x0000ff00) >> 8;
            //int  blue = c & 0x000000ff;
            // and the Java Color is ...
            Color color = new Color(red); 
            int newBlue = color.getBlue();
            int oldBlue = lastColor.getBlue();
            switch(popArrayRow)
            {
                case 0:
                {
                    arrayVar = newBlue;
                    popArrayRow = 1;
                    break;
                }
                case 1:
                {
                    arrayVar = row;
                    popArrayRow = 2;
                    break;
                }
                case 2:
                {
                    arrayVar = column;
                    popArrayRow = 0;
                    break;
                }
            }
            popArray[row][popArrayColumn] = arrayVar;
            //System.out.println(popArray[row][popArrayColumn]);
            switch(popArrayColumn)
            {
                case 0:
                {
                    popArrayColumn = 1;
                    break;
                }
                case 1:
                {
                    popArrayColumn = 2;
                    break;
                }
                case 2:
                {
                    popArrayColumn = 0;
                    break;
                }
            }


            if(newBlue > oldBlue)
            {
                startX = row;
                startY = column;
                //System.out.print(row);
                //System.out.print(",");
                //System.out.println(column);
                System.out.print("The oldBlue is ");
                System.out.println(oldBlue);
                lastColor = color;
            }



        }
    } 

Ответы [ 2 ]

1 голос
/ 13 апреля 2011
int red = (c & 0x00ff0000) >> 16;
        //int  green = (c & 0x0000ff00) >> 8;
        //int  blue = c & 0x000000ff;
        // and the Java Color is ...
        Color color = new Color(red); 
       int newBlue = color.getBlue();

Вы имеете в виду "Color color = new Color (c)"? Ваше значение newBlue всегда будет 0 ...

Кроме того, что именно вы пытаетесь сделать с помощью конструкции popArray? Переменные вашего состояния изменяют себя один раз на пиксель, вероятно, не получится то, что вы хотите ... Звучит так, как будто вы хотите SortedMap<int,Point> с ключом blueValue, значением которого является координата x, y точек (хранится либо как массив или объект Point). Тогда у вас будет ваша структура данных, упорядоченная по синему значению, и вы сможете напрямую считывать свои очки.

Удачи!

0 голосов
/ 13 апреля 2011

Вы не показали объявление go popArray (а также некоторые другие переменные, которые, как я полагаю, являются целыми числами, которые инициализированы в 0).Вы описываете это как "2D-массив с 3 столбцами".Я предполагаю, что вы объявили его как int[1024][3], поэтому в popMap есть одна строка на строку, затем ваши 3 "столбца", которые предназначены для хранения синего значения, исходной координаты x и исходного yкоординаты.

Итак, во-первых, неясно, как вы собираетесь хранить одну запись в этом массиве для каждого пикселя в исходном изображении.Но, возможно, мое предположение о том, как вы объявили, что это неправильно.

В любом случае, каждый раз, когда вы проходите внутренний цикл, вы, по сути, хотите установить

popArray[currentPixel] = {blueValue, origX, origY}

, но вместо этогоВы назначаете только одно из трех значений каждый раз в цикле.Итак, вы делаете что-то вроде

popArray[0][0] = blueValue //first iteration; blueValue from row 0 col 0
popArray[0][1] = 0 //second iteration; row from row 0 col 1
popArray[0][2] = 2 //third iteration; column from row 0 col 2

Так что, надеюсь, вы уже можете видеть, что что-то не так, поскольку вы заполняете «столбцы», которые должны идти вместе со значениями из разных итераций цикла.Хуже того, вы начинаете перезаписывать эти значения на следующей итерации внутреннего цикла (которая будет повторяться в общей сложности 768 раз до row приращений):

popArray[0][0] = blueValue // fourth iteration; blueValue from row 0 col 4; overwrite value assigned on first iteration
etc...

Вместо использования 3 «столбцов» массивас различными значениями для хранения этих элементов данных было бы разумно создать класс, который содержит три значения и проясняет, что к чему.popArray будет содержать этот тип объекта.Кроме того, я бы сделал это List вместо массива, так как он более гибкий, и вы можете просто вызвать Collections.sort() в конце;или @jsegal предлагает использовать структуру данных, которая сортируется при вставке элементов.Какой из них лучше, может зависеть от того, что вы хотите сделать с ними позже.

...