2012-02-03 131 views
11

我有一個RGB bufferedImage bImg。
我想將bImg轉換爲灰色圖像。將RGB圖像轉換爲灰度圖像減少了java中的內存

BufferedImage grayIm=new BufferedImage(bImg.getWidth(null), bImg.getHeight(null), BufferedImage.TYPE_BYTE_GRAY); 

我試過這個grayIm,但是我不能設置這個grayIm的灰度值。

+0

可能的複製 - http://stackoverflow.com/questions/6471340/how-do-i-desaturate-a-bufferedimage-in-java/6471524#6471524 – mre 2012-02-03 16:11:57

+0

是什麼_「我無法設置灰度這greyIm的值「_是什麼意思? – 2012-02-03 16:12:09

回答

25

一種方式可以是色彩空間(表現欠佳)轉換:

ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY); 
ColorConvertOp op = new ColorConvertOp(cs, null); 
BufferedImage image = op.filter(bufferedImage, null); 

另一個辦法是使用一個BufferedImage,因爲你做的(更好的性能):

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

最後並非最不重要的,最佳性能是使用一GrayFilter:

ImageFilter filter = new GrayFilter(true, 50); 
ImageProducer producer = new FilteredImageSource(colorImage.getSource(), filter); 
Image mage = Toolkit.getDefaultToolkit().createImage(producer); 

源:http://www.codebeach.com/2008/03/convert-color-image-to-gray-scale-image.html

編輯:per Mark的評論。

+1

在第三種方法中,未定義createImage。 'this'應該是'Toolkit.getDefaultToolkit()' – 2014-06-12 10:06:14

+0

第三個實現比下面的解決方案有更好的性能嗎? – 2015-08-27 14:05:05

20

注意:這不是什麼OP要求(因爲它減少內存使用量),但我會離開這裏,因爲人們喜歡這個手冊每個象素的方法。


這很簡單。這個想法是遍歷圖像的每個像素,並將其更改爲灰度等效。

public static void makeGray(BufferedImage img) 
{ 
    for (int x = 0; x < img.getWidth(); ++x) 
    for (int y = 0; y < img.getHeight(); ++y) 
    { 
     int rgb = img.getRGB(x, y); 
     int r = (rgb >> 16) & 0xFF; 
     int g = (rgb >> 8) & 0xFF; 
     int b = (rgb & 0xFF); 

     int grayLevel = (r + g + b)/3; 
     int gray = (grayLevel << 16) + (grayLevel << 8) + grayLevel; 
     img.setRGB(x, y, gray); 
    } 
} 

但是,這並不減少內存。要有效減少內存使用量,請執行相同的過程,但使用灰度BufferedImage作爲輸出。

+2

但是這會減少內存@Martijn Courteaux – 2012-02-03 16:26:04

+7

實際上,灰度轉換不是R,G和B通道的簡單平均值,因爲藍色對我們的亮度感知貢獻最小,而綠色貢獻最多。爲了精確表示灰度圖像中的光強度,需要加權平均值。使用0.2126R + 0.7152G + 0.0722B – 2015-12-29 13:11:03

+0

@ Mr.WorshipMe:太棒了!我意識到這種現象。你的重量上的任何資源? – 2015-12-29 22:39:56