#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’, которая находится внутри границ