我正在 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/