使用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对话框实例代码
May 10 Javascript
浅析JS刷新框架中的其他页面 &amp;&amp; JS刷新窗口方法汇总
Jul 08 Javascript
jQuery制作仿腾讯web qq用户体验桌面
Aug 20 Javascript
JS实现仿QQ聊天窗口抖动特效
May 10 Javascript
JavaScript实现广告的关闭与显示效果实例
Jul 02 Javascript
js实现简易聊天对话框
Aug 17 Javascript
JS选取DOM元素常见操作方法实例分析
Dec 10 Javascript
微信小程序实现slideUp、slideDown滑动效果及点击空白隐藏功能示例
Dec 11 Javascript
IE11下CKEditor在Bootstrap Modal中下拉问题的解决
Sep 25 Javascript
javascript(基于jQuery)实现鼠标获取选中的文字示例【测试可用】
Oct 26 jQuery
vue实现浏览器全屏展示功能
Nov 27 Javascript
vscode中使用npm安装babel的方法
Aug 02 Javascript
关于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
使用PHP强制下载PDF文件示例
2014/01/17 PHP
用 Composer构建自己的 PHP 框架之设计 MVC
2014/10/30 PHP
用 Composer构建自己的 PHP 框架之使用 ORM
2014/10/30 PHP
PHP判断一个gif图片是否为动态图片的方法
2014/11/19 PHP
jQuery 源代码显示控件 (Ajax加载方式).
2009/05/18 Javascript
javascript 循环读取JSON数据的代码
2010/07/17 Javascript
mailto的使用技巧分享
2012/12/21 Javascript
JQuery AJAX 中文乱码问题解决
2013/06/05 Javascript
根据表格中的某一列进行排序的javascript代码
2013/11/29 Javascript
jquery UI Datepicker时间控件的使用及问题解决
2016/04/28 Javascript
常用js,css文件统一加载方法(推荐) 并在加载之后调用回调函数
2016/09/23 Javascript
自己封装的一个原生JS拖动方法(推荐)
2016/11/22 Javascript
关于Vue.js 2.0的Vuex 2.0 你需要更新的知识库
2016/11/30 Javascript
原生JS实现移动端web轮播图详解(结合Tween算法造轮子)
2017/09/10 Javascript
vuex根据不同的用户权限展示不同的路由列表功能
2019/09/20 Javascript
vue之debounce属性被移除及处理详解
2019/11/13 Javascript
springboot+vue+对接支付宝接口+二维码扫描支付功能(沙箱环境)
2020/10/15 Javascript
python使用fcntl模块实现程序加锁功能示例
2017/06/23 Python
python消费kafka数据批量插入到es的方法
2018/12/27 Python
python批量创建指定名称的文件夹
2019/03/21 Python
Python实现多态、协议和鸭子类型的代码详解
2019/05/05 Python
在自动化中用python实现键盘操作的方法详解
2019/07/19 Python
详解基于python-django框架的支付宝支付案例
2019/09/23 Python
Python 实现取多维数组第n维的前几位
2019/11/26 Python
Python生成六万个随机,唯一的8位数字和数字组成的随机字符串实例
2020/03/03 Python
HTML5中的postMessage API基本使用教程
2016/05/20 HTML / CSS
美国隐形眼镜销售网站:ContactsDirect
2017/10/28 全球购物
Hurley官方网站:扎根于海滩生活方式的全球青年文化品牌
2020/05/18 全球购物
如何将字串String转换成整数int
2015/02/21 面试题
警察思想汇报
2014/01/04 职场文书
药品业务员岗位职责
2014/04/17 职场文书
优秀学生干部先进事迹材料
2014/05/26 职场文书
单位委托书范本(3篇)
2014/09/18 职场文书
护士实习自荐信
2015/03/06 职场文书
因公司原因离职的辞职信范文
2015/05/12 职场文书
SQL中的连接查询详解
2022/06/21 SQL Server