Я пытаюсь повернуть без библиотеки, но на картинке появляются черные точки

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

введите описание изображения здесь

Вот мой код, colScaled - это изображение, которое я пытаюсь преобразовать в массив:

public void arrays() {
    colScaled = zoom2();
    int j = 0;
    int i = 0;
    angel = Integer.parseInt(this.mn.jTextField1.getText());
    float degree = (float) Math.toRadians(angel);
    float cos = (float) Math.cos(degree);
    float sin = (float) Math.sin(degree);
    int W = Math.round(colScaled[0].length * Math.abs(sin) + colScaled.length * Math.abs(cos));
    int H = Math.round(colScaled[0].length * Math.abs(cos) + colScaled.length * Math.abs(sin));
    int x;
    int y;
    int xn = (int) W / 2;
    int yn = (int) H / 2;
    int hw = (int) colScaled.length / 2;
    int hh = (int) colScaled[0].length / 2;
    BufferedImage image = new BufferedImage(W + 1, H + 1, im.getType());
    for (i = 0; i < colScaled.length; i++) {
        for (j = 0; j < colScaled[0].length; j++) {
            x = Math.round((i - hw) * cos - (j - hh) * sin + xn);
            y = Math.round((i - hw) * sin + (j - hh) * cos + yn);
            image.setRGB(x, y, colScaled[i][j]);
        }
    }
    ImageIcon ico = new ImageIcon(image);
    this.mn.jLabel1.setIcon(ico);
}

person Hayk Manukyan    schedule 26.01.2017    source источник
comment
Возможный дубликат поворота массива пикселей Java   -  person Spektre    schedule 26.01.2017
comment
черные точки где ?? в изображении или окружающем изображении?   -  person gpasch    schedule 26.01.2017
comment
На изображении окружение не имеет значения   -  person Hayk Manukyan    schedule 27.01.2017
comment
Я буду очень благодарен, если ты сможешь мне помочь   -  person Hayk Manukyan    schedule 27.01.2017


Ответы (1)


Обратите внимание на этот блок в своем коде: -

for (i = 0; i < colScaled.length; i++) {
    for (j = 0; j < colScaled[0].length; j++) {
        x = Math.round((i - hw) * cos - (j - hh) * sin + xn);
        y = Math.round((i - hw) * sin + (j - hh) * cos + yn);
        image.setRGB(x, y, colScaled[i][j]);
    }
}

x и y - координаты пикселей в исходном изображении (colScaled).
Цель этого кода - заполнить все пиксели в целевом изображении (image).

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

введите здесь описание изображения

На изображении выше изображена проблема.
Видите? Возможно, красный пиксель в целевом изображении не будет записан.

Правильное решение - перебрать пиксель в конечном изображении, а затем найти соответствующий пиксель в исходном изображении.

Изменить: после публикации я только что увидел комментарий Spektre.
Я согласен, похоже, это дублированный вопрос. Слово «массив пикселей» заставило меня задуматься о том, что это не так.

person javaLover    schedule 28.01.2017