2016-10-20 1 views
0

프로그래밍에 익숙하지 않고 현재 이미지를 오른쪽 및 위 아래로 회전시키는 프로그램을 작성 중입니다. 나는 거꾸로 작동하는 방법을 얻을 수 있었지만 오른쪽으로 회전하지는 않았습니다 (시계 방향으로 90도 회전). 그것은 나에게 한계 밖의 오류를 계속주고, 나는 왜 내가 다른 예제들을 보았는지 확신 할 수 없다. 어떤 도움을 주시면 감사하겠습니다. 여기에 코드의 나머지 부분입니다스레드 "main"의 예외 java.lang.ArrayIndexOutOfBoundsException : 좌표 범위를 벗어남 setRGB

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



} 
+0

새 이미지 너비가 원본 높이와 같지 않아야합니까? ... img = new BufferedImage (height, width, BufferedImage.TYPE_INT_RGB); ... 또한 로컬 변수와 전역 변수에 같은 이름을 사용하고 있습니다. 조금 혼란 스럽습니다. – Plirkee

+0

@Plirkee Woow .... 내 문제를 고쳤다. 지금 당장 화가났다. 문제가 for 루프에서 내 성명과 함께 있다고 생각했다.나는 너무 많은 시간을 낭비했고, 얼마 전에 여기에 올렸어야했다. .. 고맙습니다. D : 충고에 감사드립니다. – Alexis

답변

0

당신이 이유

여기 내가 일하고 있어요 방법입니다 이미지를 회전 할 때 ArrayIndexOutOfBoundsException이 발생하는 것은 명시된대로입니다. 뭔가 범위를 벗어났습니다. 그것은 경계를 초과 한 귀하의 i 변수 또는 귀하의 J 변수를 초과 할 수 있으며 일반적으로 for 루프 내에서 print 문을 추가하고 두 값 중 어느 것이 적합하지 않은지를 검사하여 쉽게 테스트 할 수 있습니다 범위. 이러한 문제를 일으키는 원인과 문제점의 원인을 배우기 시작할 때 이러한 문제를 직접 해결하는 것이 좋습니다.

어쨌든 충분히 산책하고 있습니다. 문제는 이미지의 크기를 변경하지 않고 이미지를 돌리려고한다는 것입니다.

당신은 당신이 90도 이미지를 회전 할 때 당신이 실제로 폭과 높이 매개 변수를 플립 할

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

원래

같은 폭과 높이 매개 변수를 사용하여 새 이미지를 만들 수 있습니다. 이미지를 90도 회전하면 너비가 높이가되고 높이가 너비가됩니다.

그래서 문제는 여기에 있습니다 :

에서는 setRGB 기능에서 x 매개 변수에 대한 경계가 이미지의 WIDTH와 Y 매개 변수에 0에서 당신의 경우
this.img.setRGB(height-j-1,i,right.img.getRGB(i,j)); 

는 0에서의 높이입니다 당신의 이미지. 그러므로 높이 변수가 너비와 다르기 때문입니다. 예를 들어 너비가 200이고 너비가 100 인 경우 함수에 넣으면 x 매개 변수의 최대 값은 다음과 같습니다.

'100 - 199-1 = -100'이는 분명히 벗어났습니다. 범위. 그러나 우리가 당신의 코드를 변경하면.

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

이제 우리는 가능한 최대 값을 얻을 때와 같은 일을 할 때.

너비 = 100, 높이 = 200;

경계 내에있는 '200 - 99-1 = 100'

관련 문제