2013-02-21 110 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