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

下面是使用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中轻松遍历对象属性的几种方式

    关闭符合MD格式的字体 JS中轻松遍历对象属性的几种方式 JS中的对象是一种非常重要的数据类型,有时候我们需要遍历对象的所有属性以进行操作。下面是几种轻松遍历对象属性的方式: 方式1:for…in循环遍历对象 for…in是一种常见的遍历对象属性的方法。它可以遍历对象上的所有属性,可以处理对象本身定义的属性,还可以处理从Object.prototyp…

    JavaScript 2023年5月27日
    00
  • JavaScript 数组遍历的五种方法

    JavaScript 数组遍历的五种方法如下: 1. forEach() array.forEach(function(currentValue, index, arr), thisValue) forEach() 方法用于调用数组中的每个元素,并将元素传递给回调函数。该方法不会返回新的数组,而是在原始数组中执行回调函数。回调函数可以接收三个参数:当前元素的…

    JavaScript 2023年5月27日
    00
  • Javascript中产生固定结果的函数优化技巧

    当我们在编写JavaScript中的函数时,我们有时候需要函数能够返回对于特定输入的相同结果。这种类型的函数被称为Pure Function。Pure Function的一个重要特性是对于相同的输入,产生相同的输出。这使得测试和调试变得更加容易,并且减少不必要的副作用。 在本篇攻略中,我们将讨论如何优化JavaScript中的Pure Function,使其…

    JavaScript 2023年5月27日
    00
  • js正则表达式验证表单【完整版】

    我来为您详细讲解“js正则表达式验证表单【完整版】”的完整攻略。 1. 概述 在网页表单的开发中,我们经常需要对用户输入的内容进行验证,这样才能确保数据的正确性和合法性。而对于一般的验证需求,正则表达式无疑是最为方便、高效的解决方案之一。所以,本篇文章将会介绍如何使用 JavaScript 正则表达式来验证表单,以及常见的表单验证规则。 2. 表单验证规则 …

    JavaScript 2023年6月10日
    00
  • BOM系列第二篇之定时器requestAnimationFrame

    下面是关于BOM系列第二篇之定时器requestAnimationFrame的详细讲解: 什么是定时器requestAnimationFrame requestAnimationFrame是浏览器提供的一种类似定时器的 API,它可以让我们方便地控制动画的帧数,实现流畅的动画效果。 requestAnimationFrame的用法 setInterval和s…

    JavaScript 2023年6月11日
    00
  • AJAX Servlet实现数据异步交互的方法

    下面是关于“AJAX Servlet实现数据异步交互的方法”的一些完整攻略。 什么是AJAX? AJAX全称是Asynchronous JavaScript and XML(异步JavaScript和XML)。它是一种用于创建快速动态网页的技术,可以实现无需刷新页面即可更新部分页面内容的效果。AJAX可以使网页拥有更好的用户交互体验,提高网站的性能。 AJA…

    JavaScript 2023年6月11日
    00
  • JS按钮倒计时并跳转到新地址的实现代码

    下面详细讲解一下JS按钮倒计时并跳转到新地址的实现代码的完整攻略。这个功能可以用在活动页面,对按钮进行倒计时限制,避免用户频繁点击。首先,我们需要实现一个计时器,在设置好指定时间后,在指定时间到达时触发跳转链接。 实现步骤 首先,我们需要在HTML代码中创建按钮: html <button onclick=”countdown(10,’http://w…

    JavaScript 2023年6月11日
    00
  • JavaScript 使用技巧精萃(.net html

    JavaScript 使用技巧精萃 在本文中,将介绍一些 JavaScript 的使用技巧,帮助开发者更高效地编写 JavaScript 代码。 1. 少用全局变量 全局变量在 JavaScript 中是非常常见的,但过多的使用全局变量可能会导致代码混乱、难以维护。所以,尽量减少使用全局变量。可以使用 ES6 的 let 或 const 关键字来定义块级变量…

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