java - 图层是在 JavaFX Canvas 上合成图形的唯一方法吗?

标签 java canvas javafx graphics

我正在 JavaFX 中开发一个 gui,它需要在 Canvas 上合成大量对象(通常使用 alpha 掩码等)。

为了在 HTML5 Canvas 上进行比较,可以借助 DOM 结构外部的临时 Canvas 对象的帮助,通过 drawImage 函数轻松完成此操作。例如,要使用 alpha 蒙版在 Canvas 上绘制图像,我首先在临时 Canvas 上绘制图像,使用 globalCompositeOperation = "destination-in" 在其上绘制(即 blit)蒙版,然后使用复合模式 source-over 在原始 Canvas 上绘制临时 Canvas 。每次此类操作都可以重复使用临时 Canvas 。简单易行。

但是,据我所知,到目前为止,在 JavaFX 中执行此操作的推荐方法是使用分组层,即永远不会“展平”的多个重叠 Canvas 节点。

我也可以在 HTML5 中这样做,但在我最近的项目中,这会导致数十或数百个可见层,这显然是非常愚蠢的。我的方法给了我出色的表现。

话虽如此,是否有合理的方法可以在 JavaFX Canvas 上执行相同的操作?我认为手动执行逐像素复制是笨拙的最后手段。

我错过了什么?我是否以错误的方式思考 JavaFX?

最佳答案

我之前在 JavaFx 和 Android 上这样做过,但我不知道他们在 HTML 5 上这样做 所以无论如何
您可以像在 HTML 5 上一样进行操作,您可以创建所谓的 mainCanvas ,该 Canvas 包含另一个 Canvas 的完成版本,让我们在您绘制的临时 Canvas 中使用 tempCanvas无论你想要什么,并应用你想要的蒙版,然后你拍摄 Canvas 的快照(因为 Canvas 是一个 Node 你可以使用此代码来拍摄 Canvas 的快照它)

WritableImage writableImage = new WritableImage(mainCanvas.getWidth(), mainCanvas.getHeight());
tempCanvas.snapshot(null, writableImage);

GraphicsContext context = mainCanvas.getGraphicsContext2D();
context.drawImage(writableImage,mainCanvas.getWidth(), mainCanvas.getHeight());

关于java - 图层是在 JavaFX Canvas 上合成图形的唯一方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51969288/

相关文章:

Java 静态/实例方法优化

wpf - 在 Canvas 上查找控制位置

java - 导入包但出现访问限制类型错误

Java FX 更改前一阶段场景中的标签文本

java - 从现有 Java 对象或 xsd 生成 .proto 文件

java - 我无法使用 Java 代码接收网站的所有 HTML 内容

facebook - 支付时 Facebook Canvas API for Unity 中的 API 错误代码 1383146

canvas - ionic 2 框架签名板表单生成器问题

JavaFX 阶段*有时*在 Win10 上显示为空白

java - 创建实例时将 Java 组件作为参数传递