在HTML5中,我如何轻松地绘制一个动态GIF到画布上(请不要使用太复杂的代码),在画布上只有第一帧被显示(使用drawImage)?
我相信您正在寻找http://slbkbs.org/jsgif
不幸的是,DOM不会公开GIF的单个帧,因此需要通过下载GIF(使用XMLHttpRequest),解析它,并在
<canvas>
上绘制来完成。
如果没有可用的自动化GIF文件画布动画,您可以尝试使用雪碧图,但这确实需要更多的代码。
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例程无法获取动画的后续帧。如果图像绝对定位在画布下方,则渲染会滞后。
这里是链接的插件 :D
在Photoshop中,您可以打开gif(打开时间轴窗口),然后选择“文件>导出>渲染视频”,并选择“Photoshop图像序列”。
预加载它们全部,添加计数器,然后只需使用drawImage根据计数器绘制正确的图像即可。
画布动画不是HTML5规范的一部分。要么回到GIF,要么考虑使用基于JavaScript的库来渲染SVG,或者回退到Canvas/VML:http://raphaeljs.com/