2013-11-27 102 views
0

我正在開發一個圖像處理項目,在這個項目中我必須填充破裂繪畫的數字化圖像。我必須將彩色圖像轉換爲灰度圖像,對灰度圖像的二維數組執行一些計算並將其寫回灰色圖像。這個代碼是:在java中的灰度圖像中寫入像素數據

BufferedImage colorImage=ImageIO.read(new File(strImagePath)); 

      BufferedImage image = new BufferedImage(colorImage.getWidth(),colorImage.getHeight(),BufferedImage.TYPE_BYTE_GRAY); 
      Graphics g = image.getGraphics(); 
      g.drawImage(colorImage, 0, 0, null); 
      g.dispose(); 

      ImageIO.write(image,"PNG",new File("Image.PNG")); 

      BufferedImage imgOriginal=ImageIO.read(new File("Image.PNG")); 

      int width=image.getWidth(); 
      int height=image.getHeight(); 

      BufferedImage im=new BufferedImage(width,height,BufferedImage.TYPE_BYTE_GRAY); 

      int arrOriginal[][]=new int[height][width]; 


      for(int i=0;i<height;i++) 
       for(int j=0;j<width;j++) 
        arrOriginal[i][j]=imgOriginal.getRGB(j,i)& 0xFF; 

      for(int i=0;i<height;i++) 
       for(int j=0;j<width;j++) 
        im.setRGB(j,i,arrOriginal[i][j]); 

      ImageIO.write(im,"PNG",new File("Image1.PNG")); 

但輸出圖像很暗得多,我沒有得到原始圖像回(我沒有做任何更改)。

我認爲setRGB()語句應該有一些變化,但我不知道是什麼。

要寫入圖像後,我也曾嘗試:

`

BufferedImage im = new BufferedImage(width,height,BufferedImage.TYPE_BYTE_GRAY); 
WritableRaster raster = im.getRaster(); 
for(int i=0;i<height;i++) 
    for(int j=0;j<width;j++) 
     raster.setSample(j,i,0,arrOriginal[i][j]); 

`

但是這也沒有給我原始圖像回來。

任何人都可以提供我解決這個問題? 在此先感謝。

+0

你應該知道firefox和chrome不會渲染相同顏色的png,它也可以來自java渲染引擎。 – Kiwy

+0

@Kiwy我正在使用javax.swing,因爲我的項目是一個獨立的項目。 –

+0

另請參閱http://stackoverflow.com/questions/3106269/how-to-use-type-byte-gray-to-efficiently-create-a-grayscale-bufferedimage-using – halfbit

回答

4

我對基於Java的圖像處理一無所知,但我通常對圖像處理知道很多,所以我會看看我是否可以給你任何想法。如果我錯了,請不要拍我 - 我只是在提出一個想法。

在灰度圖像中,紅色,綠色和藍色值全部相同,即紅色=綠色=藍色。所以,當你打電話給getRGB並且用0xff做AND時,你可能只會得到藍色的組件,但是沒關係,因爲紅色和綠色是相同的 - 因爲它是灰度。

我懷疑問題是,當你寫回來創建你的新輸出圖像時,你只設置了藍色組件,而不是紅色和綠色 - 它們應該仍然是相同的。嘗試寫回

original pixel + (original pixel << 8) + (original pixel <<16) 

,讓你設置不僅藍,而且紅色和綠色成分。

+0

感謝您的回覆。現在我正在獲取原始圖像。抱歉,我不能投票給你,因爲我的名聲不允許我...... –