This question already has answers here:
What causes a java.lang.ArrayIndexOutOfBoundsException and how do I prevent it?
                            
                                (25个答案)
                            
                    
                2年前关闭。
        

    

我正在尝试使用此数组创建图像:
[-8421505,-8421505,-8421505,-8421505,...]
它的长度是:62416

BufferedImage img = new BufferedImage(166, 376, BufferedImage.TYPE_INT_RGB);
int pixels[] = new int[166 * 376];


这是错误所在

img.getRaster().setPixels(0, 0, 166 , 376, pixels);

那我就保存

File file = new File("new.png");
ImageIO.write(img, "png", file);


这是:

ArrayIndexOutOfBoundsException:62416

最佳答案

由于某种原因,即使BufferedImage.TYPE_INT_RGB看起来每个像素应该具有1 int。使用WritableRaster#setPixels时,实际上每个像素需要3整数。

给定一些输入数据,

int[] values = {...};


每个int对应一个像素,其中RGB分别具有8位。需要将它们放入更大的阵列中,然后解压。

int pixels[] = new int[values.length*3];
for(int i = 0; i<values.length; i++){
   pixels[3*i] = (values[i]>>16)&0xff;
   pixels[3*i+1] = (values[i]>>8)&0xff;
   pixels[3*i+2] = (values[i])&0xff;
}


我通过创建带有红色,绿色和蓝色的values数组来进行检查。

int[] values = new int[166*376];
for(int i = 0; i<166*125; i++){
    values[i] = 0xff0000; //red
}
for(int i = 166*125; i<166*250; i++){
    values[i] = 0xff00; //green
}
for(int i = 166*250; i<166*376; i++){
    values[i] = 0xff; //blue
}

09-25 20:58