2012-02-03 132 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