【发布时间】:2011-03-04 23:36:16
【问题描述】:
在 HTML5 中,如何在有效的画布中轻松绘制(请不要使用太多复杂的代码)动画 GIF(drawImage 仅在画布中显示第一帧)
【问题讨论】:
-
另一个可能值得一看的库:github.com/benwiley4000/gif-frames
标签: html canvas gif animated-gif
在 HTML5 中,如何在有效的画布中轻松绘制(请不要使用太多复杂的代码)动画 GIF(drawImage 仅在画布中显示第一帧)
【问题讨论】:
标签: html canvas gif animated-gif
不幸的是,DOM 不会暴露 GIF 的单个帧,因此这是通过下载 GIF(使用 XMLHttpRequest)、解析它并在
<canvas>上绘制来完成的。
【讨论】:
如果 gif 文件的自动画布动画不可用,您可以尝试使用 sprite-sheets,但这确实需要更多代码。
var img_obj = {
'source': null,
'current': 0,
'total_frames': 16,
'width': 16,
'height': 16
};
var img = new Image();
img.onload = function () { // Triggered when image has finished loading.
img_obj.source = img; // we set the image source for our object.
}
img.src = 'img/filename.png'; // contains an image of size 256x16
// with 16 frames of size 16x16
function draw_anim(context, x, y, iobj) { // context is the canvas 2d context.
if (iobj.source != null)
context.drawImage(iobj.source, iobj.current * iobj.width, 0,
iobj.width, iobj.height,
x, y, iobj.width, iobj.height);
iobj.current = (iobj.current + 1) % iobj.total_frames;
// incrementing the current frame and assuring animation loop
}
function on_body_load() { // <body onload='on_body_load()'>...
var canvas = document.getElementById('canvasElement');
// <canvas id='canvasElement' width='320' height='200'/>
var context = canvas.getContext("2d");
setInterval((function (c, i) {
return function () {
draw_anim(c, 10, 10, i);
};
})(context, img_obj), 100);
}
这就是我解决问题的方法。希望这对您有所帮助。 (已测试)
【讨论】:
对于仍然遇到此问题的任何人,或者那些不想动态加载图像或弄清楚他们需要使用多少帧的人;
将动画 GIF 留在 HTML 页面上,在 CSS 中设置为 display:block、visibility:visible 和 position:relative。以负边距顶部/z-index(或你有什么)将其动态定位在画布下。然后设置一个 JavaScript 计时器,该计时器重复调用 drawImage,以尽可能快地正确刷新图像。
如果图像在 DOM 中不可见,则 drawImage 例程无法获取动画的后续帧。如果图像绝对位于画布下方,则渲染会滞后。
【讨论】:
好吧,正如其他人已经说过的那样,您必须将 pe 动画分割成帧。我解决这个问题的方法更多的是个人喜好,但我在 GIMP 中打开 GIF 并使用插件将所有显示为单独图层的帧转换为精灵表。然后我只需要在画布中为精灵设置动画,这要容易得多。
这是插件的link:D
【讨论】:
Canvas 动画不是 HTML5 规范的一部分。要么恢复为 GIF,要么考虑使用基于 JavaScript 的库来呈现 SVG 或回退到 Canvas/VML:http://raphaeljs.com/
【讨论】: