使用JS和canvas实现gif动图的停止和播放代码

yizhihongxing

下面是使用JS和canvas实现gif动图的停止和播放的完整攻略:

1. 了解Canvas画布和Image对象

Canvas是HTML5新增的标签,允许通过JS脚本来实现动态绘制图像。而Image对象则是JS中常见的图像对象,可以用于显示一张图片。

2. 载入GIF动图并绘制到Canvas画布上

使用Image对象来载入本地存储路径下的GIF动图文件,并将其绘制到Canvas画布上,Canvas的context对象提供了一个用于绘制图片的方法 drawImage()。代码类似于以下这段:

let canvas = document.getElementById("mycanvas");
let ctx = canvas.getContext("2d");

let img = new Image();
img.onload = function() {
    ctx.drawImage(img, 0, 0);
}
img.src = "mygif.gif";

3. GIF动图的暂停

要实现GIF动图的暂停,我们需要重新绘制一张空白的画布来覆盖原有的动图。对于这种情况,我们可以使用绘制一个与Canvas画布大小相等的矩形来覆盖之前的动图。代码类似于以下这段:

function pauseGif() {
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    ctx.fillRect(0, 0, canvas.width, canvas.height);
}

4. GIF动图的播放

要实现GIF动图的播放,我们可以利用Image对象的自定义属性和requestAnimationFrame()方法来让动图进行连续播放。我们需要记录GIF动图的每一帧,然后将其逐一绘制到Canvas画布上。代码类似于以下这段:

let canvas = document.getElementById("mycanvas");
let ctx = canvas.getContext("2d");

let img = new Image();
img.onload = function() {
    let gif_frames = [];
    let frame = 0;
    let is_paused = false;

    // 获得GIF动图的每一帧
    let duration_sum = 0;
    let canvas_temp = document.createElement("canvas");
    canvas_temp.width = canvas.width;
    canvas_temp.height = canvas.height;
    let ctx_temp = canvas_temp.getContext("2d");
    let draw_frame = function(i) {
        duration_sum += img.frames[i].duration;
        img.seek(i);
        ctx_temp.clearRect(0, 0, canvas.width, canvas.height);
        ctx_temp.drawImage(img, 0, 0);
        gif_frames.push({
            duration: img.frames[i].duration,
            image: canvas_temp.toDataURL("image/png")
        });
        if(i < img.frames.length - 1) {
            draw_frame(i+1);
        }
    }
    draw_frame(0);

    function playGif() {
        if(is_paused) return;
        ctx.clearRect(0, 0, canvas.width, canvas.height);
        ctx.drawImage(
            new Image(),
            0, 0, canvas.width, canvas.height,
            0, 0, canvas.width, canvas.height
        );
        ctx.drawImage(new Image(gif_frames[frame].image), 0, 0);
        frame = (frame + 1) % gif_frames.length;
        setTimeout(playGif, gif_frames[frame].duration);
    }

    playGif();
}
img.src = "mygif.gif";

5. 示例说明

以下是两个示例:

示例一: 使用按钮实现GIF动图播放和暂停

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>GIF动图播放和暂停</title>
</head>
<body>
    <canvas id="mycanvas" width="500" height="500"></canvas>
    <button id="play-button">播放</button>
    <button id="pause-button">暂停</button>
    <script>
        let canvas = document.getElementById("mycanvas");
        let ctx = canvas.getContext("2d");

        let img = new Image();
        img.onload = function() {
            let gif_frames = [];
            let frame = 0;
            let is_paused = false;
            let play_button = document.getElementById("play-button");
            let pause_button = document.getElementById("pause-button");

            // 获得GIF动图的每一帧
            let duration_sum = 0;
            let canvas_temp = document.createElement("canvas");
            canvas_temp.width = canvas.width;
            canvas_temp.height = canvas.height;
            let ctx_temp = canvas_temp.getContext("2d");
            let draw_frame = function(i) {
                duration_sum += img.frames[i].duration;
                img.seek(i);
                ctx_temp.clearRect(0, 0, canvas.width, canvas.height);
                ctx_temp.drawImage(img, 0, 0);
                gif_frames.push({
                    duration: img.frames[i].duration,
                    image: canvas_temp.toDataURL("image/png")
                });
                if(i < img.frames.length - 1) {
                    draw_frame(i+1);
                }
            }
            draw_frame(0);

            // 播放GIF动图
            function playGif() {
                if(is_paused) return;
                ctx.clearRect(0, 0, canvas.width, canvas.height);
                ctx.drawImage(
                    new Image(),
                    0, 0, canvas.width, canvas.height,
                    0, 0, canvas.width, canvas.height
                );
                ctx.drawImage(new Image(gif_frames[frame].image), 0, 0);
                frame = (frame + 1) % gif_frames.length;
                setTimeout(playGif, gif_frames[frame].duration);
            }

            play_button.addEventListener("click", function() {
                is_paused = false;
                playGif();
            });
            pause_button.addEventListener("click", function() {
                is_paused = true;
            });
        }
        img.src = "mygif.gif";
    </script>
</body>
</html>

示例二: 使用鼠标事件实现GIF动图暂停

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>GIF动图暂停</title>
</head>
<body>
    <canvas id="mycanvas" width="500" height="500"></canvas>
    <script>
        let canvas = document.getElementById("mycanvas");
        let ctx = canvas.getContext("2d");

        let img = new Image();
        img.onload = function() {
            let gif_frames = [];
            let frame = 0;

            // 获得GIF动图的每一帧
            let duration_sum = 0;
            let canvas_temp = document.createElement("canvas");
            canvas_temp.width = canvas.width;
            canvas_temp.height = canvas.height;
            let ctx_temp = canvas_temp.getContext("2d");
            let draw_frame = function(i) {
                duration_sum += img.frames[i].duration;
                img.seek(i);
                ctx_temp.clearRect(0, 0, canvas.width, canvas.height);
                ctx_temp.drawImage(img, 0, 0);
                gif_frames.push({
                    duration: img.frames[i].duration,
                    image: canvas_temp.toDataURL("image/png")
                });
                if(i < img.frames.length - 1) {
                    draw_frame(i+1);
                }
            }
            draw_frame(0);

            // 暂停GIF动图
            canvas.addEventListener("mousedown", function() {
                ctx.clearRect(0, 0, canvas.width, canvas.height);
                ctx.fillRect(0, 0, canvas.width, canvas.height);
            });

            // 播放GIF动图
            function playGif() {
                ctx.clearRect(0, 0, canvas.width, canvas.height);
                let img_temp = new Image();
                img_temp.src = gif_frames[frame].image;
                img_temp.onload = function() {
                    ctx.drawImage(img_temp, 0, 0);
                    frame = (frame + 1) % gif_frames.length;
                    setTimeout(playGif, gif_frames[frame].duration);
                };
            }

            playGif();
        }
        img.src = "mygif.gif";
    </script>
</body>
</html>

以上就是使用JS和canvas实现GIF动图的停止和播放的完整攻略了。希望对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用JS和canvas实现gif动图的停止和播放代码 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • js 定时器setTimeout无法调用局部变量的解决办法

    当我们在js代码中定义了局部变量,如果要在定时器setTimeout中使用该变量,可能会出现无法调用的情况。这是因为定时器是基于全局变量执行的,而局部变量只能在定义它的函数中使用。 为了解决这个问题,我们可以采用以下两种方法: 方法一:使用闭包 我们可以通过将变量封装在一个函数内部,并返回一个函数的方式创建一个闭包,使得该变量可以被定时器正确调用。以下是一个…

    JavaScript 2023年6月11日
    00
  • javascript 的Document属性和方法集合

    来讲解一下“javascript 的Document属性和方法集合”的完整攻略。 1. Document属性 1.1 title属性 title属性用于获取或修改HTML文档的标题。例如: // 查看当前文档标题 console.log(document.title); // 修改当前文档标题 document.title = "新标题"…

    JavaScript 2023年6月10日
    00
  • javascript中window.open在原来的窗口中打开新的窗口(不同名)

    首先,我们需要了解 window.open() 这个函数,它能打开一个新的浏览器窗口或选项卡并返回新窗口的引用。它可以传递一些参数,如新窗口的 URL、名称、大小等等。 如果我们想在原来的窗口中打开一个新的窗口,可以使用以下代码: window.open("http://www.example.com", "_self&quot…

    JavaScript 2023年6月11日
    00
  • 学习JavaScript设计模式(单例模式)

    以下是学习JavaScript设计模式(单例模式)的详细攻略: 什么是设计模式 设计模式是编程中广泛使用的可重用的解决方案。它们是处理常见问题的方法,有助于编写具有可靠性、灵活性和可复用性的代码。JavaScript 的设计模式主要是从其他编程语言中引入的,如 C++ 和 Java。 什么是单例模式 单例模式是一种创建型设计模式,它保证类只有一个实例,并提供…

    JavaScript 2023年6月10日
    00
  • JS碰撞运动实现方法详解

    JS碰撞运动实现方法详解 什么是JS碰撞运动? JS碰撞运动是指在HTML页面中通过JavaScript代码实现物体自由运动的效果,并且当这些物体相互碰撞时,它们之间会产生一定的相互作用和反应的效果。 JS碰撞运动在游戏开发、动画制作、交互界面设计等方面有着广泛的应用,是Web开发中一个非常重要的技术。 实现方法 JS碰撞运动的实现,可以分为三个步骤:自由运…

    JavaScript 2023年5月28日
    00
  • 学习AngularJs:Directive指令用法(完整版)

    学习AngularJs:Directive指令用法(完整版)是一篇关于AngularJS指令用法的详细攻略。下面我来详细讲解该攻略。 概述 该攻略主要介绍AngularJS中Directive指令的用法,指令是AngularJS的核心部分,它们允许我们扩展HTML,使其具有复杂的行为和交互特性。指令可以用于添加自定义标记,创建自定义元素,设置元素样式,添加事…

    JavaScript 2023年6月10日
    00
  • VUE实现注册与登录效果

    下面是关于“VUE实现注册与登录效果”的完整攻略。 一、注册功能 1. 在HTML中设计注册表单 首先,在HTML页面中设计一个注册表单。可以使用v-model指令实现输入框的数据绑定: <template> <div> <h2>注册</h2> <form> <label>用户名:&lt…

    JavaScript 2023年6月11日
    00
  • JavaScript中的字符串操作详解

    JavaScript中的字符串操作详解 JavaScript中的字符串操作是一个基础且重要的方面。在这个攻略中,我们将详细介绍字符串的常用操作及其在JavaScript应用中的具体用法。 字符串的声明方法 在JavaScript中,我们可以使用单引号或双引号来声明一个字符串。 示例代码1 let str1 = ‘这是一个双引号包裹的字符串’; let str…

    JavaScript 2023年6月1日
    00
合作推广
合作推广
分享本页
返回顶部