将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/
- 在Eclipse中调试Java时如何使getResourceAsStream工作?
- 为什么这个Java正则表达式导致“非法转义字符”错误?
- Spring Boot Error:java.lang.NoSuchMethodError:org.apache.tomcat.util.scan.StandardJarScanner.setJarScanFilter
- 为什么Phantom References在排队时没有被清除?
- 有哪些方法可以从WSDL文件自动生成Java客户端存根?
- 文本比较算法或程序?
- 无法启动DSE搜索的solr方面
- Java 8流连接并返回多个值
- 如何使用RestEasy将JSON转换为POJO列表