координаты вне границ - PullRequest
0 голосов
/ 28 декабря 2018

Я сделал программу для зеркального отображения изображения, но код ниже выдает ошибку:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 
Coordinate out of bounds!
at sun.awt.image.ByteInterleavedRaster.setDataElements(Unknown Source)
at java.awt.image.BufferedImage.setRGB(Unknown Source)
at algoritm.MirrorImage.applyAlgoritm(MirrorImage.java:43)
at ImageProcess.main(ImageProcess.java:36)

Вот исходный код:

package algoritm;   
import java.awt.image.BufferedImage;   
public class MirrorImage implements Algoritm{   
private BufferedImage bufferedImage;
private int width;
private int height;
//getter si setter
    public MirrorImage(BufferedImage bufferedImage) {
        this.bufferedImage = bufferedImage;

    }

    public BufferedImage getBufferedImage() {
        return bufferedImage;
    }

    public void setBufferedImage(BufferedImage bufferedImage) {
        this.bufferedImage = bufferedImage;
    }

    public void applyAlgoritm() {
        width = bufferedImage.getWidth();
        height = bufferedImage.getHeight();
        for(int y = 0; y < height; y++){
            for(int lx = 0, rx = width*2 - 1; lx < width; lx++, rx--){
                int p = bufferedImage.getRGB(lx,y);
                bufferedImage.setRGB(lx, y, p);
                bufferedImage.setRGB(rx, y, p);
              }
        }
    }
}

Я думаю, что-то не так свторой сет RGB.Если я прокомментирую это, моя ошибка исчезнет, ​​но программа не сделает правильных действий.

Ответы [ 2 ]

0 голосов
/ 30 декабря 2018
setRGB(int x, int y, int rgb)
Sets a pixel in this BufferedImage to the specified RGB value.

Я не обычный Java-программист, но когда я читаю документы для функции setRgb (), как вы можете видеть выше, x и y содержит координаты пикселя, где rgb - это новое значение пикселя.Когда я смотрю на ваши циклы for, во втором цикле у вас есть bufferedImage.setRGB(rx, y, p);, в котором вы пытаетесь установить rx, поскольку значение x в начале равно rx = width*2 - 1;, и, без сомнения, это превышает ширину изображения.Итак, я полагаю, вам нужно пересмотреть свой алгоритм для решения вашей проблемы.

0 голосов
/ 28 декабря 2018

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

На первой итерации здесь:

width = bufferedImage.getWidth();
rx = width*2 - 1;
  ...
  bufferedImage.setRGB(rx, y, p);

rx выходит за пределы, попробуйте в конструкторе создать новое чистое изображение

BufferedImage newImage = new BufferedImage(2 * bufferedImage.getWidth(),  bufferedImage.getHieght(), BufferedImage.TYPE_INT_ARGB);

и зеркало поверх этого, так что в вашем цикле

//read from the old one 
int p = bufferedImage.getRGB(lx,y);

// and write in the new one
newImage.setRGB(lx, y, p);
newImage.setRGB(rx, y, p);
...