使用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 相关文章推荐
javascript getElementsByClassName 和js取地址栏参数
Jan 02 Javascript
js左侧多级菜单动态的解决方案
Feb 01 Javascript
jQuery学习3:操作元素属性和特性
Feb 07 Javascript
js获取url中指定参数值的示例代码
Dec 14 Javascript
JavaScript字符集编码与解码详谈
Feb 02 Javascript
js弹出窗口简单实现代码
Mar 22 Javascript
JS实现简单抖动效果
Jun 01 Javascript
Angular4的输入属性与输出属性实例详解
Nov 29 Javascript
js动态设置select下拉菜单的默认选中项实例
Aug 21 Javascript
JavaScript canvas绘制圆弧与圆形
Feb 18 Javascript
Node.js API详解之 timer模块用法实例分析
May 07 Javascript
使用vue编写h5公众号跳转小程序的实现代码
Nov 27 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
PHP内核介绍及扩展开发指南―基础知识
2011/09/11 PHP
php 删除一个数组中的某个值.兼容多维数组!
2012/02/18 PHP
基于PHP常用函数的用法详解
2013/05/10 PHP
Laravel框架中缓存的使用方法分析
2019/09/06 PHP
flash javascript之间的通讯方法小结
2008/12/20 Javascript
浅析jQuery(function(){})与(function(){})(jQuery)之间的区别
2014/01/09 Javascript
浅析jQuery EasyUI中的tree使用指南
2014/12/18 Javascript
JavaScript判断前缀、后缀是否是空格的方法
2015/04/15 Javascript
js HTML5 Ajax实现文件上传进度条功能
2016/02/13 Javascript
深入理解jQuery 事件处理
2016/06/14 Javascript
老生常谈combobox和combotree模糊查询
2017/04/17 Javascript
nodejs批量下载图片的实现方法
2017/05/19 NodeJs
vue实现页面加载动画效果
2017/09/19 Javascript
Nodejs把接收图片base64格式保存为文件存储到服务器上
2018/09/26 NodeJs
浅析vue-router原理
2018/10/19 Javascript
如何去除富文本中的html标签及vue、react、微信小程序中的过滤器
2018/11/21 Javascript
vue中多个倒计时实现代码实例
2019/03/27 Javascript
vue-cli3.0实现一个多页面应用的历奇经历记录总结
2020/03/16 Javascript
js实现翻牌小游戏
2020/07/31 Javascript
原生js+canvas实现验证码
2020/11/29 Javascript
Python多线程编程(二):启动线程的两种方法
2015/04/05 Python
python smtplib模块自动收发邮件功能(二)
2018/05/22 Python
Django如何自定义分页
2018/09/25 Python
python全栈知识点总结
2019/07/01 Python
软件测试企业面试试卷
2016/07/13 面试题
金融专业大学生职业生涯规划范文
2014/01/16 职场文书
安全生产标语
2014/06/06 职场文书
房屋鉴定委托书范本
2014/09/23 职场文书
2015年乡镇环保工作总结
2015/04/22 职场文书
暂停营业通知
2015/04/25 职场文书
2015年度信用社工作总结
2015/05/04 职场文书
时尚女魔头观后感
2015/06/04 职场文书
Mysql 性能监控及调优
2021/04/06 MySQL
pytorch Dropout过拟合的操作
2021/05/27 Python
MySQL学习之基础操作总结
2022/03/19 MySQL
python APScheduler执行定时任务介绍
2022/04/19 Python