将 Canvas 转换为 WritableImage 的备选方案
Alternative(s) of converting Canvas to WritableImage
我正在开发一个需要在 JavaFX 中比较大量图像数据的应用程序。为了比较,我需要获取图像中像素的 rgb 数据。假设我需要比较的图片是 Picture1 和 Picture2。 图片1为用户选择的输入图片。 Picture2是我用编程方式画的图。
AFAIK,在 JavaFX 中获取每个像素的 rgb 数据的唯一方法是使用 PixelReader
of Image
。 Picture1 很好,因为它是一个输入。但我需要在 Picture2 上画图,而 Picture2 是 Canvas
(我在 Picture2 上画多边形,因为逐像素绘制使用 PixelWriter 在我看来有点复杂)并且没有 PixelReader
或具有类似功能的东西。所以我的解决方案如下:
- 读取输入图像并制作Picture1
- 制作Canvas并画图
- 将 Canvas 附加到场景
- 制作Scene快照并制作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。
我正在开发一个需要在 JavaFX 中比较大量图像数据的应用程序。为了比较,我需要获取图像中像素的 rgb 数据。假设我需要比较的图片是 Picture1 和 Picture2。 图片1为用户选择的输入图片。 Picture2是我用编程方式画的图。
AFAIK,在 JavaFX 中获取每个像素的 rgb 数据的唯一方法是使用 PixelReader
of Image
。 Picture1 很好,因为它是一个输入。但我需要在 Picture2 上画图,而 Picture2 是 Canvas
(我在 Picture2 上画多边形,因为逐像素绘制使用 PixelWriter 在我看来有点复杂)并且没有 PixelReader
或具有类似功能的东西。所以我的解决方案如下:
- 读取输入图像并制作Picture1
- 制作Canvas并画图
- 将 Canvas 附加到场景
- 制作Scene快照并制作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。