将RGB图像转换为灰度图像减少了java中的内存
我有一个RGB bufferedImage bImg。
我想将bImg转换为灰色图像。将RGB图像转换为灰度图像减少了java中的内存
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
编辑:per Mark的评论。
在第三种方法中,未定义createImage。 'this'应该是'Toolkit.getDefaultToolkit()' – 2014-06-12 10:06:14
第三个实现比下面的解决方案有更好的性能吗? – 2015-08-27 14:05:05
注意:这不是什么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作为输出。
但是这会减少内存@Martijn Courteaux – 2012-02-03 16:26:04
实际上,灰度转换不是R,G和B通道的简单平均值,因为蓝色对我们的亮度感知贡献最小,而绿色贡献最多。为了精确表示灰度图像中的光强度,需要加权平均值。使用0.2126R + 0.7152G + 0.0722B – 2015-12-29 13:11:03
@ Mr.WorshipMe:太棒了!我意识到这种现象。你的重量上的任何资源? – 2015-12-29 22:39:56
我有同样的问题。您选择的解决方案不仅取决于性能水平。还有必要了解你努力提高的图像质量。请看这些例子。他们都维护源代码。 http://codehustler.org/blog/java-to-create-grayscale-images-icons/
可能的复制 - http://stackoverflow.com/questions/6471340/how-do-i-desaturate-a-bufferedimage-in-java/6471524#6471524 – mre 2012-02-03 16:11:57
是什么_“我无法设置灰度这greyIm的值“_是什么意思? – 2012-02-03 16:12:09