我正在开发一个需要在JavaFX中进行大量比较图像数据的应用程序。为了进行比较,我需要获取图像中像素的rgb数据。假设我需要比较的图片是 Picture1 和 Picture2 。 Picture1 是用户选择的输入图片。 Picture2 是我以编程方式制作的图纸。
AFAIK,在JavaFX中获得每像素rgb数据的唯一方法是PixelReader
Image
。这对于 Picture1 来说很好,因为它是一个输入。但我需要在 Picture2 上绘图,而 Picture2 是Canvas
(我在Picture2上绘制多边形,因为PixelWriter逐像素绘制有点复杂IMO)并且没有PixelReader
或具有类似功能的东西。所以我的解决方案如下:
所以我有一个类似的方法:
public static WritableImage makeDrawableImage(Canvas in) {
AnchorPane root = new AnchorPane(in);
WritableImage out = new WritableImage((int)in.getWidth(), (int)in.getHeight());
Scene sc = new Scene(root, in.getWidth(), in.getHeight());
out = in.snapshot(null, null);
return out;
}
然而,快照完成需要很长时间。永远不会分配out
的值。我不知道我做错了什么。
是否可以将Canvas
转换为Image
或WritableImage
?或者也许有一个库可以使用PixelWriter
更容易地绘制多边形?
请对我说软。这是我关于Stack Overflow的第一个问题,我不是真正的程序员,也不是IT学生。我编码是一种爱好。
所以,提前谢谢。欢呼声。
答案 0 :(得分:1)
您可以使用以下方法创建画布的快照:
public static WritableImage pixelScaleAwareCanvasSnapshot(Canvas canvas, double pixelScale) {
WritableImage writableImage = new WritableImage((int)Math.rint(pixelScale*canvas.getWidth()), (int)Math.rint(pixelScale*canvas.getHeight()));
SnapshotParameters spa = new SnapshotParameters();
spa.setTransform(Transform.scale(pixelScale, pixelScale));
return canvas.snapshot(spa, writableImage);
}
除非您有HiDPI屏幕,否则像素比例通常为1.0。