Горизонтальное преобразование массива (2D)

Это простой способ перевернуть изображение по горизонтали и / или вертикали. Предпосылка состоит в том, что для двумерного целочисленного массива, созданного при импорте изображения, я должен создать метод с параметром int [] [] и перевернуть его по горизонтали перед возвратом void.

Синтаксис ниже:

public static void horizontalFlip(int[][] imgArray)
    {
        int temp;
        for (int i = 0; i < imgArray.length; i++)
        {
            for (int j = 0; j < imgArray[i].length / 2; j++)
            {
                temp = imgArray[i][j];
                imgArray[i][j] = imgArray[imgArray.length - 1 - i][j];
                imgArray[imgArray.length - 1 - i][j] = temp;
            }
        }
    }

Я использую imgArray в качестве параметра массива и использую temp в качестве заполнителя, в то время как цикл меняет местами пиксели, точнее, это было намерением. В настоящее время окно ничего не делает после запроса на переворот. Может ли кто-нибудь помочь мне найти проблему с логикой или синтаксисом?

Заранее спасибо, пожалуйста, укажите любые подробности, которые я должен предоставить P.S. Я могу подтвердить, что предоставленный без ссылки код работает и протестирован.


person user3072912    schedule 24.01.2015    source источник
comment
Неужели ничего не происходит? Мне кажется, что вы делаете сальто. Вы пробовали перевернуть несимметричное изображение?   -  person Trilarion    schedule 25.01.2015


Ответы (3)


Это происходит потому, что вы используете i вместо j. Но i не остановится по прошествии половины пути, а будет продолжен и заново поменяет местами массив.
Вот правильный код:

for (int i = 0; i < imgArray.length; i++) {
    for (int j = 0; j < imgArray[i].length / 2; j++) {
        temp = imgArray[i][j];
        imgArray[i][j] = imgArray[i][imgArray.length - 1 - j];
        imgArray[i][imgArray.length - 1 -j] = temp;
    }
}

Или, если вы хотите поменять местами столбцы, а не строки:

for (int i = 0; i < imgArray.length / 2; i++) {
    for (int j = 0; j < imgArray[i].length; j++) {
        temp = imgArray[i][j];
        imgArray[i][j] = imgArray[imgArray.length - 1 - i][j];
        imgArray[imgArray.length - 1 -i][j] = temp;
    }
}
person afzalex    schedule 24.01.2015
comment
О, я вижу. Думаю, следовало быть более наблюдательным. Как ни странно, программа, похоже, отлично работает со вторым битом кода, который вы добавили (чтобы перевернуть по вертикали), однако первый бит вызывает исключение индекса. Компилятор, кажется, указывает на строку 10, которая есть imgArray [i] [j] = imgArray [i] [imgArray.length - 1 - j]; Может ли такое случиться, если ширина и высота не равны? - person user3072912; 25.01.2015
comment
Согласно предоставленному коду, i следует использовать для высоты и j для ширины. Тогда он будет работать независимо от того, равны ли габариты или нет. @ user3072912 - person afzalex; 27.01.2015

Это правильно перевернет изображение по горизонтали:

public static void horizontalFlip(int[][] imgArray)
{
    int temp;
    for (int i = 0; i < imgArray.length; i++) {
        for (int j = 0; j < imgArray[i].length/2; j++) {
        temp = imgArray[i][j];
        imgArray[i][j] = imgArray[i][imgArray[i].length - 1 - j];
        imgArray[i][imgArray[i].length - 1 - j] = temp;
        }
    }
}
person jfreeman    schedule 24.01.2015

Пожалуйста, посмотрите мое решение ниже,

for(int i=0; i<matrix.length / 2; i++)
{
    int[] row = matrix[i];
    int[] temp = row;
    matrix[i] = matrix[matrix.length - 1];
    matrix[matrix.length - 1] = row;
}
person DIA    schedule 21.10.2020