将RGB图像转换为灰度图像减少了java中的内存

我有一个RGB bufferedImage bImg。
我想将bImg转换为灰色图像。

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

我试过这个grayIm但是我不能为这个grayIm设置灰度值。

一种方法是转换色彩空间(性能不佳):

 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

编辑:根据马克的评论。

注意:这不是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作为输出。

我遇到了同样的问题。 您选择的解决方案不仅取决于性能级别。 您还需要了解您努力争取的图像质量。 请看这些例子。 他们都维护源代码。 http://codehustler.org/blog/java-to-create-grayscale-images-icons/