将 Canvas 转换为 WritableImage 的备选方案

Alternative(s) of converting Canvas to WritableImage

我正在开发一个需要在 JavaFX 中比较大量图像数据的应用程序。为了比较,我需要获取图像中像素的 rgb 数据。假设我需要比较的图片是 Picture1Picture2图片1为用户选择的输入图片。 Picture2是我用编程方式画的图。

AFAIK,在 JavaFX 中获取每个像素的 rgb 数据的唯一方法是使用 PixelReader of ImagePicture1 很好,因为它是一个输入。但我需要在 Picture2 上画图,而 Picture2Canvas (我在 Picture2 上画多边形,因为逐像素绘制使用 PixelWriter 在我看来有点复杂)并且没有 PixelReader 或具有类似功能的东西。所以我的解决方案如下:

  1. 读取输入图像并制作Picture1
  2. 制作Canvas并画图
  3. 将 Canvas 附加到场景
  4. 制作Scene快照并制作WritableImage(图2)
  5. 比较图片 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 转换为 ImageWritableImage?或者也许有一个库可以使用 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。