如何从int [] []像素数组创建图像

时间:2014-08-09 19:37:38

标签: java

我有一个int[image.height][image.width]图像数组。现在我试图将其转回图像文件,但我已经失败了。

这就是我所做的:

private void intToImg(int[][] pxls,String path){
    BufferedImage image = new BufferedImage(pxls[0].length, pxls.length, BufferedImage.TYPE_INT_ARGB);
    WritableRaster raster = (WritableRaster)image.getData();
    int[] pxlsr=new int[pxls[0].length*pxls.length];
    int k=0;
    for(int i=0;i<pxls.length;i++)for(int j=0;j<pxls[0].length;j++)pxlsr[k++]=pxls[i][j];
    raster.setPixels(0,0,pxls[0].length-10,pxls.length-10,pxlsr);//index out of bounds error here...
    File f = new File(path);
    try{ImageIO.write(image, "JPG", f);}
    catch (IOException x){x.printStackTrace();}
}

但是我总是有同样的错误java.lang.ArrayIndexOutOfBoundsException。我做错了什么以及将像素数组转换为真实图像的正确方法是什么?

我刚刚增加了4中的数组长度,java.lang.ArrayIndexOutOfBoundsException终于消失了。但我仍然无法创造真实的形象。相反,无论数组的值是多少,我的图像都填充了#000009。

这就是我在做的事情:

for(int i=0;i<pxls.length;i++)for(int j=0;j<pxls[0].length;j++){
        pxlsr[k++]=pxls[i][j];
        pxlsr[k++]=pxls[i][j];
        pxlsr[k++]=pxls[i][j];
        pxlsr[k++]=pxls[i][j];
    }
raster.setPixels(0,0,pxls[0].length,pxls.length,pxlsr);

for(int i=0;i<pxls.length;i++)for(int j=0;j<pxls[0].length;j++){
        pxlsr[k++]=111;
        pxlsr[k++]=111;
        pxlsr[k++]=111;
        pxlsr[k++]=111;
    }
raster.setPixels(0,0,pxls[0].length,pxls.length,pxlsr);

还有很多其他的东西,但结果总是一样 - 图像充满了黑色!

3 个答案:

答案 0 :(得分:2)

最后我做到了!我发现错误!

而不是:

WritableRaster raster = (WritableRaster)image.getData();

应该是:

WritableRaster raster = image.getRaster();

答案 1 :(得分:1)

您可以通过调用

直接编写字节
image.setRGB(0, 0, pxls[0].length, pxls.length, pxlsr, 0, pxls[0].length);

这适合我。

答案 2 :(得分:0)

图像的经典错误是关于宽度和高度在数组中的行和列方面表示的混淆。 BufferedImage的大小必须是宽度x高度,这可能对应于pxls [0] .length x pxls [length]而不是相反。