Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用光栅创建图像时的ArrayIndexOutofBounds异常_Java_Image_Rgb_Indexoutofboundsexception_Raster - Fatal编程技术网

Java 使用光栅创建图像时的ArrayIndexOutofBounds异常

Java 使用光栅创建图像时的ArrayIndexOutofBounds异常,java,image,rgb,indexoutofboundsexception,raster,Java,Image,Rgb,Indexoutofboundsexception,Raster,我正在尝试使用以下数组创建图像: [-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像素) 那我就保存它 File fi

我正在尝试使用以下数组创建图像: [-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像素)

那我就保存它

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


ArrayIndexOutOfBoundsException:62416出于某种原因,尽管它看起来像是缓冲图像。类型为INT\u 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;
}
int像素[]=新的int[value.length*3];
对于(int i=0;i>16)&0xff;
像素[3*i+1]=(值[i]>>8)&0xff;
像素[3*i+2]=(值[i])&0xff;
}
我通过创建一个红色、绿色和蓝色的值数组来检查这一点

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
}
int[]值=新的int[166*376];

对于(int i=0;i可能会有帮助:从:
ArrayIndexOutOfBoundsException
-如果坐标不在边界内,或者如果
dArray
太小而无法容纳输入。(关于setPixels方法):同样来自javadocs:设置双数组中像素矩形的所有样本,每个数组元素包含一个样本。如果坐标不在边界内,可能会引发ArrayIndexOutOfBoundsException。但是,不保证显式边界检查。这是因为光栅每个通道使用1个整数(总共3个).所以您的数组需要是
newint[166*376*3]
thank you@matt,错误已经消失,但它已经绘制了原始图片的3个副本。我如何使它变得普通,意思是:我有一个数组,它保存376*166像素的二进制数据。我想用这个数组创建一个图像。就这么简单,而且出于某种原因,它将图片放在整个图片的上方(376*166)。颜色正在变为灰度。有没有更好的方法使用array@matt