将Canvas转换为WritableImage的替代方案

Teg*_*yat 7 java javafx canvas image snapshot

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

据我所知,得到JavaFX中每个像素的RGB数据的唯一方法是使用PixelReaderImage.这对Picture1来说很好,因为它是一个输入.但是,我需要做的图纸上的图片2图片2是一个Canvas(我借鉴图片2多边形并且因为与PixelWriter像素画像素有点复杂IMO),并没有PixelReader什么具有类似功能.所以我的解决方案如下:

  1. 读取输入图像并制作Picture1
  2. 制作画布并进行绘图
  3. 将画布附加到场景
  4. 制作场景快照并制作WritableImage(Picture2)
  5. 比较Picture1和Picture2

所以我有一个类似的方法:

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;
}
Run Code Online (Sandbox Code Playgroud)

但是快照完成需要很长时间.out永远不会分配值.我不知道我做错了什么.

有没有替代转换CanvasImageWritableImage?或者也许有一个库可以更容易地绘制多边形PixelWriter

请对我说软.这是我关于Stack Overflow的第一个问题,我不是真正的程序员,也不是IT学生.我编码作为一种爱好.

所以,提前谢谢.干杯.

mip*_*ipa 2

您可以使用以下方法创建画布快照:

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);     
}
Run Code Online (Sandbox Code Playgroud)

像素比例通常为 1.0,除非您有 HiDPI 屏幕。