坐标越界

时间:2018-12-28 15:43:06

标签: java image rgb indexoutofboundsexception

我制作了一个镜像图像的程序,但是下面的代码给出了错误:

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);
              }
        }
    }
}

我认为第二个setRGB出了点问题。如果对此发表评论,我的错误就会消失,但是程序无法正确执行操作。

2 个答案:

答案 0 :(得分:0)

您尝试修改的图像似乎没有调整大小。 尝试实例化具有双倍宽度的新的干净缓冲图像

在这里的第一次迭代:

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);

答案 1 :(得分:0)

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;,这无疑超出了图像宽度。因此,我想您需要重新考虑算法来解决您的问题。