我正在开发一个需要在 JavaFX 中比较大量图像数据的应用程序。为了比较,我需要获取图像中像素的 rgb 数据。假设我需要比较的图片是Picture1 和Picture2。 Picture1是用户选择的输入图片。 Picture2 是我以编程方式制作的绘图。
AFAIK,在 JavaFX 中获取每个像素的 rgb 数据的唯一方法是使用 Image
的 PixelReader
。 Picture1 没问题,因为它是一个输入。但我需要在 Picture2 上绘制,而 Picture2 是一个 Canvas
(我在 Picture2 上绘制多边形,因为使用 PixelWriter 逐像素绘制是IMO 有点复杂)并且没有 PixelReader
或具有类似功能的东西。所以我的解决方案如下:
- 读取输入图片并制作Picture1
- 制作 Canvas 并进行绘图
- 将 Canvas 附加到场景
- 制作场景快照并制作WritableImage(图2)
- 比较图片 1 和图片 2
所以我有一个类似这样的方法:
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 学生。我将编码作为一种爱好。
所以,提前致谢。干杯。
最佳答案
您可以使用此方法创建 Canvas 的快照:
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。
关于java - 将 Canvas 转换为 WritableImage 的替代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36833536/