【问题标题】:Animated GIF in HTML5 canvasHTML5 画布中的动画 GIF
【发布时间】:2011-03-04 23:36:16
【问题描述】:

在 HTML5 中,如何在有效的画布中轻松绘制(请不要使用太多复杂的代码)动画 GIF(drawImage 仅在画布中显示第一帧)

【问题讨论】:

标签: html canvas gif animated-gif


【解决方案1】:

相信你在找http://slbkbs.org/jsgif

不幸的是,DOM 不会暴露 GIF 的单个帧,因此这是通过下载 GIF(使用 XMLHttpRequest)、解析它并在 <canvas> 上绘制来完成的。

【讨论】:

    【解决方案2】:

    如果 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);
    }
    

    这就是我解决问题的方法。希望这对您有所帮助。 (已测试)

    【讨论】:

    • 这有点老了。我现在处理它的方式会大不相同。如果您不介意在代码中添加新库,请使用这些 cmets 中建议的众多可用替代方案之一。考虑到 ES6 的出现,这将更好地重构为具有更多功能的类。 :)
    【解决方案3】:

    对于仍然遇到此问题的任何人,或者那些不想动态加载图像或弄清楚他们需要使用多少帧的人;

    将动画 GIF 留在 HTML 页面上,在 CSS 中设置为 display:block、visibility:visible 和 position:relative。以负边距顶部/z-index(或你有什么)将其动态定位在画布下。然后设置一个 JavaScript 计时器,该计时器重复调用 drawImage,以尽可能快地正确刷新图像。

    如果图像在 DOM 中不可见,则 drawImage 例程无法获取动画的后续帧。如果图像绝对位于画布下方,则渲染会滞后。

    【讨论】:

    • 你不能像这样分层,除非你把多个画布放在一起
    • 我不认为 Ayelis 提出了多个画布层。而是将图像作为常规的 img 标签加载到 html 层(可以本地处理 gif 动画),并在其样式标签中使用 z-index 人为地将它们提升到画布层之上。这不适用于所有情况,因为您不能在“上方”放置画布元素,但它可以用于始终“位于顶部”的显示组件。您可以通过更改图像元素的 html“顶部”和“左侧”设置来在屏幕上移动图像。
    • 没错。这是我在专业应用程序中使用的一种方法,目的是从动画 GIF 中提取帧并将它们“blit”到画布中。本质上,GIF 隐藏在画布下方。不能将其设置为不可见或屏幕外,因为否则框架不会被拉出,至少在 Chrome 实例和我在 2014 年测试代码的 VTC1010 上是这样。
    【解决方案4】:

    好吧,正如其他人已经说过的那样,您必须将 pe 动画分割成帧。我解决这个问题的方法更多的是个人喜好,但我在 GIMP 中打开 GIF 并使用插件将所有显示为单独图层的帧转换为精灵表。然后我只需要在画布中为精灵设置动画,这要容易得多。

    这是插件的link:D

    【讨论】:

    【解决方案5】:

    Canvas 动画不是 HTML5 规范的一部分。要么恢复为 GIF,要么考虑使用基于 JavaScript 的库来呈现 SVG 或回退到 Canvas/VML:http://raphaeljs.com/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-16
      • 2011-10-24
      • 1970-01-01
      • 2015-03-19
      • 2012-05-15
      • 2016-04-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多