将Canvas转换为WritableImage的替代方案

时间:2016-04-25 06:37:48

标签: java image canvas javafx snapshot

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

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

  1. 读取输入图像并制作Picture1
  2. 制作画布并进行绘图
  3. 将画布附加到场景
  4. 制作场景快照并制作WritableImage(Picture2)
  5. 比较Picture1和Picture2
  6. 所以我有一个类似的方法:

    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学生。我编码是一种爱好。

    所以,提前谢谢。欢呼声。

1 个答案:

答案 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。