【发布时间】:2018-09-28 01:28:03
【问题描述】:
我正在使用 HTML Canvas 制作类似于可视化工具的东西。在绘制每一帧时,我想获取当前的画布数据并将其淡出。
我发现获得这种效果的几种方法是:
在整个画布上绘制背景颜色的半透明框。实际上不会淡出内容,因此画布后面的任何内容都会被覆盖。这已经足够快了,而且它可以完成的事实证明浏览器能够进行所有必要的计算。
使用 canvas.getImageData(),操作图像数据,然后使用 canvas.putImageData() 重新应用它。这样做是非常低效的,将大量应该是本机逻辑的东西放入 js 中。太慢了,不适合实际使用。
使用 canvas.toDataUrl() 生成图像 (png/jpg) 并使用 ctx.globalOpacity 重新绘制具有一定透明度的图像。将画布数据转换为图像并返回的步骤非常昂贵(压缩、标题等)。太慢了,不适合实际使用。
如何在画布上淡出我传递的帧,同时在顶部设置新帧的动画?
我已经检查了这些:
Canvas Fade Out Particles - 非常相似的问题,答案建议对我的问题不适用的解决方案(使用精灵并重绘整个画布)
FadeIn FadeOut in Html5 canvas - 问题是关于淡入/淡出画布上的图像,而不是画布内容本身。
编辑:我想我可能已经找到了解决方案: https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Tutorial/Compositing
【问题讨论】:
-
第二个例子是使用
ctx.globalAlpha。是我为了淡出整个画布而使用的。第一个示例是使用 rgba 和 hsla 颜色淡出 逐个粒子。您建议使用 canvas.getImageData() 和 canvas.putImageData()。这在效率方面是极其昂贵的。你也可以使用 css opacity -
@enxaneta 我想使用 ctx.globalAlpha 淡出整个画布,但获取图像数据(我能找到)的唯一方法是先转换为 png。
标签: javascript animation canvas