2013-02-21 111 views
2

我想将图像转换为二维像素数组,然后对其执行一些操作,然后将生成的二维数组转换回图像。但我总是得到一个纯粹的黑色图像。我无法弄清楚我错在哪里。这就是我所做的。所有的操作都需要在8位灰度图像上完成。将图像转换为二维数组,然后将图像返回到Java

  • 首先我得到二维像素数组。

    public int[][] compute(File file) 
    { 
    try 
    { 
        BufferedImage img= ImageIO.read(file); 
        Raster raster=img.getData(); 
        int w=raster.getWidth(),h=raster.getHeight(); 
        int pixels[][]=new int[w][h]; 
        for (int x=0;x<w;x++) 
        { 
         for(int y=0;y<h;y++) 
         { 
          pixels[x][y]=raster.getSample(x,y,0); 
         } 
        } 
    
        return pixels; 
    
    } 
    catch (Exception e) 
    { 
        e.printStackTrace(); 
    } 
    return null; 
    } 
    
  • 然后我做了一些操作的像素阵列

  • 下一页上我的数组转换回图像。

    public java.awt.Image getImage(int pixels[][]) 
    { 
        int w=pixels.length; 
        int h=pixels[0].length; 
        BufferedImage image=new BufferedImage(w,h,BufferedImage.TYPE_BYTE_GRAY); 
        WritableRaster raster=(WritableRaster)image.getData(); 
        for(int i=0;i<w;i++) 
        { 
         for(int j=0;j<h;j++) 
         { 
          raster.setSample(i,j,0,pixels[i][j]); 
         } 
        } 
    
    File output=new File("check.jpg"); 
    try { 
        ImageIO.write(image,"jpg",output); 
    } 
    catch (Exception e) 
    { 
        e.printStackTrace(); 
    } 
    return image; 
    } 
    

但我得到一个完整的黑色图像,我相信,这是不完全的黑色。我应该怎么做才能获得正确的结果?

EDIT - 施加efan的溶液后,当我的图像保存到文件中,假设的(0,0)是68的像素值,然后从它有时会发生变化,以70有时相同的文件计算所述像素值到71 ..每个像素都有很小的失真,但是它损坏了整个图像。有没有修复?

+0

@丹:错误类型..现在纠正。 – 2013-02-21 16:06:14

回答

5

我认为图像是完全黑色的原因是SampleModel对于Raster是错误的。这是我的代码:

private SampleModel sampleModel; 

public int[][] compute(File file) 
{ 
    ... 
    sampleModel = raster.getSampleModel(); 
    ... 
} 

public java.awt.Image getImage(int pixels[][]) 
{ 
    ... 
    WritableRaster raster= Raster.createWritableRaster(sampleModel, new Point(0,0)); 
    for(int i=0;i<w;i++) 
    { 
     for(int j=0;j<h;j++) 
     { 
      raster.setSample(i,j,0,pixels[i][j]); 
     } 
    } 

    BufferedImage image=new BufferedImage(w,h,BufferedImage.TYPE_BYTE_GRAY); 
    image.setData(raster); 
    ... 
} 

而这对我很好。我的理解是,BufferedImage.TYPE_BYTE_GRAY不会精确选择您需要的内容。不同的东西可能会更好,但我不知道这些类型与颜色/样本模型的对应关系。如果您知道您需要哪种样品模型,您可以直接使用它:

WritableRaster raster= Raster.createWritableRaster(new PixelInterleavedSampleModel(0, w, h, 1, 1920, new int[] {0}), new Point(0,0)); 
+0

谢谢你的答案。现在我没有得到黑色图像,但是即使在创建像素数组之后调用getImage(int [] [])函数而不进行任何更改,我也无法取回原始图像。而且,即使在改变许多像素后,我也能得到相同的图像。你能告诉我理由和纠正吗?谢谢 – 2013-02-21 16:14:05

+0

我不确定我是否正确理解了这个,但是您是否尝试过使用getPixel(),setPixel()而不是使用getSample(),setSample()?示例仅包含有关像素的部分信息(例如,仅RGB中的红色)。 – efan 2013-02-21 20:34:15

+0

AFAIK灰度图像R = G = B。我已经使用了这两种方法。假设像素值是71.然后我将它修改为70并写入图像。之后,当我读取图像时,我得到了一些不同的值,例如68,69或70. – 2013-02-22 20:54:45