我有一个RGB的bufferedImage bImg。
我想将bImg转换为灰度图像。
BufferedImage grayIm=new BufferedImage(bImg.getWidth(null), bImg.getHeight(null), BufferedImage.TYPE_BYTE_GRAY);
我尝试了 grayIm,但是我无法为这个 grayIm 设置灰度值。
我有一个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
编辑:根据Mark的评论。
this
应该是Toolkit.getDefaultToolkit()
。 - Mark Jeronimus注意:这不是问题提出者所要求的(因为它并没有减少内存使用),但我会留在这里,因为像手动逐像素处理这样的方法很受人们欢迎。相反,我将展示如何精确计算灰度颜色。
这很简单。思路是遍历图像中的每个像素,并将其更改为其灰度等效值。
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);
// Normalize and gamma correct:
float rr = Math.pow(r / 255.0, 2.2);
float gg = Math.pow(g / 255.0, 2.2);
float bb = Math.pow(b / 255.0, 2.2);
// Calculate luminance:
float lum = 0.2126 * rr + 0.7152 * gg + 0.0722 * bb;
// Gamma compand and rescale to byte range:
int grayLevel = (int) (255.0 * Math.pow(lum, 1.0 / 2.2));
int gray = (grayLevel << 16) + (grayLevel << 8) + grayLevel;
img.setRGB(x, y, gray);
}
}
然而,这并没有减少内存。要有效地减少内存使用量,请执行相同的过程,但将灰度BufferedImage用作输出。
//ANDY'S DOWN AND DIRTY GRAYSCALE™ gray=((Rs/255.0)**2.2*0.2126+(Gs/255.0)**2.2*0.7152+(Bs/255.0)**2.2*0.0722)**0.4545*255;
- Myndex我也遇到了同样的问题。你选择的解决方案不仅取决于性能水平,还需要理解你追求哪种图像质量。请看这些例子,它们都保持源代码。 http://codehustler.org/blog/java-to-create-grayscale-images-icons/