我试图将一张图片转换为纯黑白(不是灰度)。
我使用了以下代码:
BufferedImage blackAndWhiteImage = new BufferedImage(
dWidth.intValue(),
dHeight.intValue(),
BufferedImage.TYPE_BYTE_BINARY);
Graphics2D graphics = blackAndWhiteImage.createGraphics();
graphics.drawImage(colourImage, 0, 0, null);
return blackAndWhiteImage;
一切都很好,直到我决定尝试更亮的颜色,比如Google Logo:
它输出了这个:
然后我尝试先通过使用以下方法进行灰度处理:
BufferedImage blackAndWhiteImage2 = new BufferedImage(
dWidth.intValue(),
dHeight.intValue(),
BufferedImage.TYPE_USHORT_GRAY);
看起来它保存了蓝色,但没有最亮的颜色(在这种情况下是黄色),并且您可能会发现它的质量下降了:
非常感谢您的建议;我相信我正在寻找的是将每种颜色转换为黑色,除了白色(这将是背景颜色),当应用TYPE_BYTE_BINARY时,已经完成此操作,删除了alpha通道。编辑: 也许我没有解释得很清楚:
- 最终图片必须有白色背景 **1
- 每种其他颜色都必须转换为黑色
**1- 有些情况下,图片实际上是黑底白字...这很恼人(whiteOnBlackExample),因为它会使这个过程变得非常复杂,所以我将在以后留下这个问题,现在的重点是转换“普通”图像。
我所做的是,首先去掉 alpha 通道(如果存在)-> 因此将 alpha 通道转换为白色;然后将每种其他颜色转换为黑色。
pixel(x, y) < threshold ? white : black
。然后只需选择适当的阈值即可。由于原始像素是RGB格式,您还可能需要将此值转换为可与阈值进行比较的值。有几种方法可以实现这一点: 亮度 方法:(max(R, G, B) + min(R, G, B)) / 2
; 平均值 方法:(R + G + B) / 3
; 亮度 方法:0.21 * R + 0.72 * G + 0.07 * B
。 - Yevhen Danchenko