线程" main"中的例外情况java.lang.ArrayIndexOutOfBoundsException:坐标超出范围setRGB

时间:2016-10-20 17:58:27

标签: java image rotation

我是编程新手,我目前正致力于将图像向右旋转并颠倒的程序。我能够使倒置方法工作,但不能向右旋转(顺时针旋转90度)。它不断给我一个出界的错误,我不知道为什么我看了其他的例子。任何帮助将不胜感激。

以下是我正在处理的方法:

public Image rotateRight()
{
  Image right = new Image (this);
  img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
  int width = right.img.getWidth();
  int height = right.img.getHeight();


  for (int i = 0; i < width; i++)
        for (int j = 0; j < height; j++)
        {
            this.img.setRGB(height-j-1,i,right.img.getRGB(i,j));

        }
   return right;
}

以下是代码的其余部分:

import java.awt.image.*;
import java.io.*;
import javax.imageio.*;

public class Image {

private BufferedImage img = null;
int width;
int height;

private Image()
{
}

public Image (int w, int h)
{
    img = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB );
   width = w;
    height = h;
}

public Image (Image anotherImg)
{
width = anotherImg.img.getWidth();
    height = anotherImg.img.getHeight();
    img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB );

    for (int i = 0; i < height; i++)
        for (int j = 0; j < width; j++)
        {
            this.img.setRGB(j,i,anotherImg.img.getRGB(j,i)) ;
        }

}


public String toString()
{
    return "Width of Image:" +width+"\nHeight of Image:"+height;
}


public Image (String filename)
{
    try
    {
        img = ImageIO.read(new File(filename));
        width = img.getWidth();
         height = img.getHeight();
    }
    catch (IOException e)
    {
            System.out.println(e);
    }
}

public void save(String filename, String extension)
{
    try
    {
        File outputfile = new File(filename);
        ImageIO.write(img, extension, outputfile);
    }
    catch (IOException e)
    {
        System.out.println(e);
    }
}
public Image copy()
{
    Image copiedImage = new Image(this);
    return copiedImage;
}

这里是主要的:

  public static void main (String args[])
{
    Image srcimg = new Image("apple.jpg");

    System.out.println(srcimg);

  Image copy = srcimg.copy();
    copy.save("apple-copy.jpg", "jpg");
  Image copy2 = srcimg.copy();


  Image right = copy2.rotateRight();

  right.save("apple-rotateRight.jpg", "jpg");



}   

1 个答案:

答案 0 :(得分:0)

The reason you are getting an ArrayIndexOutOfBoundsException when rotating your image is as stated. Something is out of bounds. It could be either your i variable that has exceeded its bounds or your j variable that has exceeded its bounds and this is generally easy to test for by just adding a print statement within your for loop and checking which one of the two values is out of bounds. It is good practice to try to resolve these problems yourself as you will start learning what causes these and where the problem lies.

Anyways enough of my rambling. The problem that you seem to have is that you are trying to turn the image without changing the size of the image.

You are creating a new Image with the same width and height parameters as the original

img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB );

However when you want to rotate an image by 90 degrees you actually want to flip the width and height parameters. If you think about it, it makes sense when you rotate an image by 90 degrees the width will become the height and the height will become the width.

So your problem is here:

this.img.setRGB(height-j-1,i,right.img.getRGB(i,j));

In your case the bounds for the x parameter in the setRGB function is from 0 to the WIDTH of your image and the y parameter is from 0 to the HEIGHT of your image. Therefore because your height variable is different from your width. If for example your WIDTH is 200 and your HEIGHT is 100. When you put this in to the function the greatest value for the x parameter will be:

'100 - 199 - 1 = -100' which is clearly out of bounds. However if we change your code to.

img = new BufferedImage(height, width, BufferedImage.TYPE_INT_RGB );

now when we do the same thing as before where we get the maximum possible value.

WIDTH = 100, HEIGHT = 200;

'200 - 99 - 1 = 100' which is inside the bounds