Исключение в потоке «main» java.lang.ArrayIndexOutOfBoundsException: координата выходит за пределы setRGB

#java #image #rotation

#java #изображение #поворот

Вопрос:

Я новичок в программировании и в настоящее время работаю над программой, которая поворачивает изображение вправо и вверх ногами. Мне удалось заставить работать перевернутый метод, но не повернуть вправо (на 90 градусов по часовой стрелке). Он продолжает выдавать мне ошибку out of bounds, и я не уверен, почему, поскольку я просмотрел другие примеры. Будем признательны за любую помощь.

Вот метод, над которым я работаю:

 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. разве ширина вашего нового изображения не должна быть равна высоте оригинала? … Я имею в виду, как насчет img = new BufferedImage( height,width, BufferedImage.TYPE_INT_RGB); … также вы используете одинаковые имена для локальных и глобальных переменных .. и это немного сбивает с толку… просто говорю.

2. @Plirkee Вау …. это устранило мою проблему, я так зол прямо сейчас, все это время я думал, что проблема была в моем заявлении в циклах for. Я потратил так много часов, должен был опубликовать здесь некоторое время назад.. Большое вам спасибо: D и спасибо за совет.

Ответ №1:

Причина, по которой вы получаете исключение ArrayIndexOutOfBoundsException при повороте вашего изображения, такова, как указано. Что-то выходит за рамки. Это может быть либо ваша переменная i, которая превысила свои границы, либо ваша переменная j, которая превысила свои границы, и это, как правило, легко проверить, просто добавив инструкцию print в ваш цикл for и проверив, какое из двух значений выходит за пределы. Хорошей практикой является попытка решить эти проблемы самостоятельно, поскольку вы начнете узнавать, что их вызывает и в чем заключается проблема.

В любом случае, хватит моей болтовни. Проблема, с которой вы, похоже, сталкиваетесь, заключается в том, что вы пытаетесь повернуть изображение без изменения размера изображения.

Вы создаете новое изображение с теми же параметрами ширины и высоты, что и у оригинала

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

Однако, когда вы хотите повернуть изображение на 90 градусов, вы на самом деле хотите изменить параметры ширины и высоты. Если вы подумаете об этом, это имеет смысл, когда вы поворачиваете изображение на 90 градусов, ширина становится высотой, а высота становится шириной.

Итак, ваша проблема здесь:

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

В вашем случае границы для параметра x в функции setRGB составляют от 0 до ШИРИНЫ вашего изображения, а параметр y равен от 0 до ВЫСОТЫ вашего изображения. Следовательно, поскольку ваша переменная height отличается от вашей width. Если, например, ваша ШИРИНА равна 200, а ВЫСОТА равна 100. Когда вы вводите это в функцию, наибольшее значение параметра x будет равно:

‘100 — 199 — 1 = -100’, что явно выходит за рамки. Однако, если мы изменим ваш код на.

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

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

ШИРИНА = 100, ВЫСОТА = 200;

‘200 — 99 — 1 = 100’, которая находится внутри границ