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


Posted in Javascript onSeptember 01, 2017

HTML5 canvas可以读取图片信息,绘制当前图片。于是可以实现图片马赛克,模糊,色值过滤等很多图片特效。我们这里不用那么复杂,只要读取我们的图片,重绘下就可以。

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

HTML代码:

<img id="testImg" src="xxx.gif" width="224" height="126">
<p><input type="button" id="testBtn" value="停止"></p>

JS代码:

if ('getContext' in document.createElement('canvas')) {
 HTMLImageElement.prototype.play = function() {
  if (this.storeCanvas) {
   // 移除存储的canvas
   this.storeCanvas.parentElement.removeChild(this.storeCanvas);
   this.storeCanvas = null;
   // 透明度还原
   image.style.opacity = '';
  }
  if (this.storeUrl) {
   this.src = this.storeUrl; 
  }
 };
 HTMLImageElement.prototype.stop = function() {
  var canvas = document.createElement('canvas');
  // 尺寸
  var width = this.width, height = this.height;
  if (width && height) {
   // 存储之前的地址
   if (!this.storeUrl) {
    this.storeUrl = this.src;
   }
   // canvas大小
   canvas.width = width;
   canvas.height = height;
   // 绘制图片帧(第一帧)
   canvas.getContext('2d').drawImage(this, 0, 0, width, height);
   // 重置当前图片
   try {
    this.src = canvas.toDataURL("image/gif");
   } catch(e) {
    // 跨域
    this.removeAttribute('src');
    // 载入canvas元素
    canvas.style.position = 'absolute';
    // 前面插入图片
    this.parentElement.insertBefore(canvas, this);
    // 隐藏原图
    this.style.opacity = '0';
    // 存储canvas
    this.storeCanvas = canvas;
   }
  }
 };
}
 
var image = document.getElementById("testImg"), 
 button = document.getElementById("testBtn");
 
if (image && button) {
 button.onclick = function() {
  if (this.value == '停止') {
   image.stop();
   this.value = '播放';
  } else {
   image.play();
   this.value = '停止';
  }
 };
}

上面代码并未详尽测试,以及可能的体验问题(IE闪动)没有具体处理(影响原理示意),若要实际使用,需要自己再微调完美下。

不足:

1. IE9+支持。IE7/IE8不支持canvas没搞头。

2. 只能停止gif,不能真正意义的暂停。因为canvas获得的gif图片信息为第一帧的信息,后面的貌似获取不到。要想实现暂停,而不是停止,还需要进一步研究,如果你有方法,非常欢迎分享。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery UI的Dialog无法提交问题的解决方法
Jan 11 Javascript
js判断一个元素是否为另一个元素的子元素的代码
Mar 21 Javascript
JavaScript获取网页表单action属性的方法
Apr 02 Javascript
jQuery实现为LI列表前3行设置样式的方法【2种方法】
Sep 04 Javascript
jQuery动态改变多行文本框高度的方法
Sep 07 Javascript
JS中微信小程序自定义底部弹出框
Dec 22 Javascript
vue元素实现动画过渡效果
Jul 01 Javascript
不到200行 JavaScript 代码实现富文本编辑器的方法
Jan 03 Javascript
vue中如何使用ztree
Feb 06 Javascript
使用p5.js临摹动态图片
Nov 04 Javascript
JavaScript实现弹出窗口效果
Dec 09 Javascript
Vue Element plus使用方法梳理
Dec 24 Vue.js
关于Promise 异步编程的实例讲解
Sep 01 #Javascript
[js高手之路]单例模式实现模态框的示例
Sep 01 #Javascript
JQuery EasyUI 结合ztrIee的后台页面开发实例
Sep 01 #jQuery
详解使用angular的HttpClient搭配rxjs
Sep 01 #Javascript
JS中关于正则的巧妙操作
Aug 31 #Javascript
JavaScript表单即时验证 验证不成功不能提交
Aug 31 #Javascript
js实现canvas保存图片为png格式并下载到本地的方法
Aug 31 #Javascript
You might like
德生PL450的电路分析和低放电路的改进办法
2021/03/02 无线电
Yii入门教程之目录结构、入口文件及路由设置
2014/11/25 PHP
JS 容错处理代码, 屏蔽错误信息
2021/03/09 Javascript
一些技巧性实用js代码小结
2009/10/14 Javascript
Fixie.js 自动填充内容的插件
2012/06/28 Javascript
Jquery实现搜索框提示功能示例代码
2013/08/13 Javascript
判断输入是否为空,获得输入类型的JS代码
2013/10/30 Javascript
jQuery点击改变class并toggle及toggleClass()方法定义用法
2015/12/11 Javascript
简单掌握JavaScript中const声明常量与变量的用法
2016/05/21 Javascript
vue-cli构建项目使用 less的方法
2017/10/04 Javascript
Vue前端开发规范整理(推荐)
2018/04/23 Javascript
微信小程序访问豆瓣电影api的实现方法
2019/03/31 Javascript
vue 实现小程序或商品秒杀倒计时
2019/04/14 Javascript
深入解析vue 源码目录及构建过程分析
2019/04/24 Javascript
Vue学习之axios的使用方法实例分析
2020/01/06 Javascript
python进阶教程之词典、字典、dict
2014/08/29 Python
Python中关于Sequence切片的下标问题详解
2017/06/15 Python
一篇文章快速了解Python的GIL
2018/01/12 Python
详解pandas库pd.read_excel操作读取excel文件参数整理与实例
2019/02/17 Python
Python List cmp()知识点总结
2019/02/18 Python
Python实现打包成库供别的模块调用
2020/07/13 Python
python3 re返回形式总结
2020/11/20 Python
用纯css3实现的图片放大镜特效效果非常不错
2014/09/02 HTML / CSS
P D PAOLA法国官网:西班牙著名的珠宝首饰品牌
2020/02/15 全球购物
中间件的定义
2016/08/09 面试题
创业计划书中包含的9个方面
2013/12/26 职场文书
中学生自我鉴定
2014/02/04 职场文书
大学生党员自我批评
2014/02/14 职场文书
部队万能检讨书
2014/02/20 职场文书
《盘古开天地》教学反思
2014/02/28 职场文书
学习十八大的心得体会
2014/09/12 职场文书
爱的教育观后感
2015/06/17 职场文书
2016七夕情人节感言
2015/12/09 职场文书
学习弘扬焦裕禄精神心得体会
2016/01/23 职场文书
《清澈的湖水》教学反思
2016/02/17 职场文书
PyTorch中permute的使用方法
2022/04/26 Python