2014-09-10 189 views
2

这是我的代码,用Java编写。它获取图像并逐个更改像素,直到达到图像的最后一个像素,然后将图像写出。我上线67得到一个例外的ArrayIndexOutOfBounds,在那里我宣布一个新的Color对象:创建新对象时ArrayIndexOutOfBounds?

Color pixel = new Color(image.getRGB(j,i)); 

我使用UNIX为一类,以及这个代码,如果该信息相关。任何想法发生了什么?

public class SecretDecoder 
{ 
    public static void main(String[] args) 
    { 
    try 
    { 
     BufferedImage image = ImageIO.read(new File(args[0])); 
     int height = image.getHeight(); 
     int width = image.getWidth(); 
     int[] rgbOriginal = new int[3]; 

     if(args[1].equalsIgnoreCase("red")) 
     { 
      rgbOriginal[0] = 255; 
      rgbOriginal[1] = 0; 
      rgbOriginal[2] = 0; 
     } 
     else if(args[1].equalsIgnoreCase("green")) 
     { 
      rgbOriginal[0] = 0; 
      rgbOriginal[1] = 255; 
      rgbOriginal[2] = 0; 
     } 
     else if(args[1].equalsIgnoreCase("blue")) 
     { 
      rgbOriginal[0] = 0; 
      rgbOriginal[1] = 0; 
      rgbOriginal[2] = 255; 
     } 
     else if(args[1].equalsIgnoreCase("white")) 
     { 
      rgbOriginal[0] = 255; 
      rgbOriginal[1] = 255; 
      rgbOriginal[2] = 255; 
     } 
     else if(args[1].equalsIgnoreCase("gray")) 
     { 
      rgbOriginal[0] = 128; 
      rgbOriginal[1] = 128; 
      rgbOriginal[2] = 128; 
     } 
     else if(args[1].equalsIgnoreCase("cyan")) 
     { 
      rgbOriginal[0] = 0; 
      rgbOriginal[1] = 255; 
      rgbOriginal[2] = 255; 
     } 
     else 
     { 
      rgbOriginal[0] = 0; 
      rgbOriginal[1] = 255; 
      rgbOriginal[2] = 0; 
     } 

     System.out.println(width); 
     System.out.println(height); 
     for(int i = 0; i < height; i++) 
     { 
      for (int j = 0; j < width; j++) 
      { 
       Color pixel = new Color(image.getRGB(j,i)); 
       if(pixel.getRed() == rgbOriginal[0] && pixel.getGreen() == rgbOriginal[1] && pixel.getBlue() == rgbOriginal[2]) 
       { 
        if(args[2].equalsIgnoreCase("red")) 
         image.setRGB(j,i,Color.RED.getRGB()); 
        else if(args[2].equalsIgnoreCase("green")) 
         image.setRGB(j,i,Color.GREEN.getRGB()); 
        else if(args[2].equalsIgnoreCase("blue")) 
         image.setRGB(j,i,Color.BLUE.getRGB()); 
        else if(args[2].equalsIgnoreCase("white")) 
         image.setRGB(j,i,Color.WHITE.getRGB()); 
        else if(args[2].equalsIgnoreCase("gray")) 
         image.setRGB(j,i,Color.GRAY.getRGB()); 
        else if(args[2].equalsIgnoreCase("cyan")) 
         image.setRGB(j,i,Color.CYAN.getRGB()); 
        else 
         image.setRGB(j,i,Color.BLACK.getRGB()); 
       } 
      } 
     } 

     File resultFile = new File("decoded_file.png"); 
     ImageIO.write(image, "PNG", resultFile); 
    } 
    catch(Exception e) 
    { 
     System.err.println(e.getMessage()); 
     e.printStackTrace(); 
    } 
} 

}

+0

看起来像... C#或Java ... – 2014-09-10 22:59:13

+1

是的,对不起。在这个论坛的第一篇文章。这确实是Java。生病编辑在我的身体。 – Phalanges 2014-09-10 23:00:27

+0

不是args [0]程序的名称? – Chrisky 2014-09-10 23:02:22

回答

0

也许图像不开始在(0,0)。

我想你将不得不像here那样调用image.getMinX()和image.getMinY()。

System.out.println(image.getMinX()); 
System.out.println(image.getMinY()); 
for(int i = image.getMinY(); i < height; i++) { 
    for (int j = image.getMinX(); j < width; j++) {