我正在尝试将图像转换为仅黑白(不是灰度)。
我用过这个:
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徽标:
它出来了:
然后我首先使用以下方法尝试通过灰度级:
BufferedImage blackAndWhiteImage2 = new BufferedImage(
dWidth.intValue(),
dHeight.intValue(),
BufferedImage.TYPE_USHORT_GRAY);
它似乎保存了蓝色,但不是最亮的(在这种情况下是黄色),并且您可能会看到它的质量下降:
非常感谢任何建议;我相信我想要的是将每种颜色转换为黑色,除了白色(这将是背景颜色),这已经在应用 TYPE_BYTE_BINARY 删除Alpha通道时完成。
修改 也许我没有解释清楚:
** 1 - 在某些情况下,图像实际上是白色的黑色...这很烦人(whiteOnBlackExample),因为它使这个过程变得很复杂,我将在稍后留下,现在优先考虑是转换“正常”图像。
我所做的是,首先删除alpha通道(如果存在) - >因此将alpha通道转换为白色;然后将所有其他颜色转换为黑色
答案 0 :(得分:4)
如果你使用JavaFX,你可以使用亮度为-1
(最小)的ColorAdjust
效果,这会使所有(非白色)颜色变黑:
public class Main extends Application {
Image image = new Image("https://i.stack.imgur.com/UPmqE.png");
@Override
public void start(Stage primaryStage) {
ImageView colorView = new ImageView(image);
ImageView bhView = new ImageView(image);
ColorAdjust colorAdjust = new ColorAdjust();
colorAdjust.setBrightness(-1);
bhView.setEffect(colorAdjust);
primaryStage.setScene(new Scene(new VBox(colorView, bhView)));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
这些Effect
已经过优化,因此它们可能比手动应用它们的速度更快。
修改强>
因为您的要求是
根据我的判断,预先设计好的效果不适合你 - 它们太具体了。你可以逐像素操作:
WritableImage writableImage = new WritableImage(image.getPixelReader(), (int) image.getWidth(), (int) image.getHeight());
PixelWriter pixelWriter = writableImage.getPixelWriter();
PixelReader pixelReader = writableImage.getPixelReader();
for (int i = 0; i < writableImage.getHeight(); i++) {
for (int j = 0; j < writableImage.getWidth(); j++) {
Color c = pixelReader.getColor(j, i);
if (c.getOpacity() < 1) {
pixelWriter.setColor(j, i, Color.WHITE);
}
if (c.getRed() > 0 || c.getGreen() > 0 || c.getBlue() > 0) {
pixelWriter.setColor(j, i, Color.BLACK);
}
}
}
ImageView imageView = new ImageView(writableImage);
请注意,您应用规则的顺序很重要。如果应用1然后应用2,则透明的非白色像素将变为白色,但如果应用2然后再应用1,则它将变为黑色。这是因为预定义的WHITE
和BLACK
颜色是不透明的。您可以手动设置红色,绿色和蓝色值,而不是更改alpha值。这一切都取决于您的确切要求。
请记住,由于某些文件格式的有损压缩,您可能根本找不到真正的白色,但是接近真白色的值并且您的眼睛无法区分它。