java - 将 Canvas 转换为 WritableImage 的替代方法

标签 java image canvas javafx snapshot

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

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

  1. 读取输入图片并制作Picture1
  2. 制作 Canvas 并进行绘图
  3. 将 Canvas 附加到场景
  4. 制作场景快照并制作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。

关于java - 将 Canvas 转换为 WritableImage 的替代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36833536/

相关文章:

python - 如何将unicode字符和行输出到图像文件中?

css - 图像反射不应有阴影

javascript - 如何通过按住并拖动在 QtQuick/QML Canvas 中绘制矩形

java - SAX解析异常 : 'Attribute ""bound to namespace "null" was already specified for element "metric"'

java - 给 DockLayoutPanel CENTER 区域一个样式名称属性?

html - 响应式内联 div 中的图像更改相邻 div 的位置

javascript - 纸.js : can't set fillColor of a symbol instance

java - GUI 没有出现在 IntelliJ IDEA 中

java - 保留日志文件的 2 个先前版本

javascript - 减慢 Canvas 上图像的移动速度