从float数组创建图像,索引越界

时间:2013-07-30 19:37:50

标签: java javax.imageio

为什么这个方法会抛出索引越界错误?试图从我自己生成的数据创建一个图像,我希望这可以工作。

private BufferedImage getImageFromFloatArray(float[] data, int w, int h) {
    BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
    System.out.println("Image pixel array size: "
                    + ((DataBufferInt) img.getRaster().getDataBuffer())
                            .getData().length);
    System.out.println("Datasize: " + data.length);
    WritableRaster raster = img.getRaster();
    raster.setPixels(0, 0, w, h, data);
    return img;
}

堆栈跟踪

Image pixel array size: 800000
Datasize: 800000
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 800000
    at java.awt.image.SampleModel.setPixels(Unknown Source)
    at java.awt.image.WritableRaster.setPixels(Unknown Source)
    at image.PixelAraryToImageTest.getImageFromFloatArray(PixelAraryToImageTest.java:36)

1 个答案:

答案 0 :(得分:1)

尝试使用Raster宽度和高度变量而不是BufferedImage宽度和高度变量。还可以使用Raster.getMinX()Raster.getMinY()

float数组中的每个值都不是像素值。每个值都是颜色组件值。因此,2x1图像实际上需要长度为4,因为您有ARGB颜色组件。例如,要使它成为红色的2x1图像,需要类似......

int numColorComponents = 4;
float[] data = new float[imgWidth*imgHeight*numColorComponents];
raster.setPixels(minX,minY, rasterWidth,rasterHeight, data);

此外,与其他图形框架不同,此处的浮点缓冲区不是标准化值的缓冲区。它的值在[0, 255]之间。因此,要将2x1图像设置为不透明红色,您的缓冲区将为:

float alpha = 255;
float red = 255;   
float[] buffer = new float[]{alpha,red,0,0,alpha,red,0,0};