【问题标题】:how do I create image from int[][] array of pixels [duplicate]如何从 int [] [] 像素数组创建图像 [重复]
【发布时间】:2014-08-09 19:37:38
【问题描述】:

我有一个图像的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);

还有很多其他的东西,但结果都是一样的——图像填充了黑色!

【问题讨论】:

    标签: java


    【解决方案1】:

    我终于做到了!我发现错误!

    代替:

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

    应该是:

    WritableRaster raster = image.getRaster();
    

    【讨论】:

      【解决方案2】:

      您可以通过调用直接写入字节

      image.setRGB(0, 0, pxls[0].length, pxls.length, pxlsr, 0, pxls[0].length);
      

      这对我有用。

      【讨论】:

      • 据我了解,image.setRGB 很好,但它往往很慢。这就是人们尝试改用栅格的原因
      【解决方案3】:

      图像的一个典型错误是混淆了数组中的行和列的宽度和高度。 BufferedImage 的大小必须是宽 x 高,这可能对应于 pxls[0].length x pxls[length],而不是相反。

      【讨论】:

        猜你喜欢
        • 2016-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-20
        • 2014-07-19
        • 2012-09-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多