我正试图做一件简单的事情。我有一个二进制图像,我想要的是将二进制图像覆盖在彩色图像上,但是二进制图像中的白色像素应该是红色的,黑色透明的。
我非常熟悉JavaFx,但我卡在这里了。我知道可以通过使用PixelReader迭代所有像素来实现它,但我相信有更简单的方法。我尝试使用某种混合效果,但到目前为止没有成功。
我认为它应该类似于这个网站上的内容:
如何在javaFX中混合两个图像
我想到了这个:
Image image = new Image("/circle.jpg", false);
ImageView iv = new ImageView(image);
Image mask = new Image("/mask.jpg", false);
ImageView ivMask = new ImageView(mask);
Rectangle r = new Rectangle(mask.getWidth(), mask.getHeight());
r.setFill(Color.RED);
r.setBlendMode(BlendMode.MULTIPLY); // sets the white area red
Group g = new Group(ivMask, r); // sets the white area red
// this is not working as expected
iv.setBlendMode(BlendMode.DIFFERENCE);
Group g2 = new Group(iv, g);
感谢任何建议!如果您认为逐像素处理比创建叠加层更快,请告诉我。
按像素读取器的解决方案如下:
Pane root = new Pane();
// read the underlaying image
root.getChildren().add(new ImageView(new Image("/src.jpg")));
Image mask = new Image("/mask.jpg");
PixelReader pixelReader = mask.getPixelReader();
Canvas resultCanvas = new Canvas();
root.getChildren().add(resultCanvas);
GraphicsContext resultLayer = resultCanvas.getGraphicsContext2D();
for (int y = 0; y < mask.getHeight(); y++) {
for (int x = 0; x < mask.getWidth(); x++) {
if( pixelReader.getColor(x, y).equals(Color.WHITE) ){
resultLayer.fillRect(x, y, 1.0, 1.0);
}
}
}
干杯!