使用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 相关文章推荐
jqgrid 简单学习笔记
May 03 Javascript
jquery 模板的应用示例
Nov 12 Javascript
用AngularJS的指令实现tabs切换效果
Aug 31 Javascript
js获取Get值的方法
Sep 29 Javascript
基于node.js依赖express解析post请求四种数据格式
Feb 13 Javascript
JS实现的tab切换选项卡效果示例
Feb 28 Javascript
js实现数组和对象的深浅拷贝
Sep 30 Javascript
vue 路由页面之间实现用手指进行滑动的方法
Feb 23 Javascript
JS实现HTML页面中动态显示当前时间完整示例
Jul 30 Javascript
TypeScript中的方法重载详解
Apr 12 Javascript
jquery将json转为数据字典的实例代码
Oct 11 jQuery
JS时间戳与日期格式互相转换的简单方法示例
Jan 30 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实现文件下载更能介绍
2012/11/23 PHP
PHP 验证码不显示只有一个小红叉的解决方法
2013/09/30 PHP
html静态页面调用php文件的方法
2014/11/13 PHP
Yii2学习笔记之汉化yii设置表单的描述(属性标签attributeLabels)
2017/02/07 PHP
PHP从数组中删除元素的四种方法实例
2017/05/12 PHP
thinkPHP5框架实现多数据库连接,跨数据连接查询操作示例
2019/05/29 PHP
laravel 解决路由除了根目录其他都404的问题
2019/10/18 PHP
php array 转json及java 转换 json数据格式操作示例
2019/11/13 PHP
IE中直接运行显示当前网页中的图片 推荐
2006/08/31 Javascript
基于jquery实现点击左右按钮图片横向滚动
2013/04/11 Javascript
nodejs中实现sleep功能实例
2015/03/24 NodeJs
javascript实现的闭包简单实例
2015/07/17 Javascript
深入理解JavaScript中的箭头函数
2015/07/28 Javascript
浅析JavaScript中浏览器的兼容问题
2016/04/19 Javascript
浅谈javascript:两种注释,声明变量,定义函数
2016/10/05 Javascript
AngularJS实现ajax请求的方法
2016/11/22 Javascript
javascript常用的设计模式
2017/02/09 Javascript
vue 1.x 交互实现仿百度下拉列表示例
2017/10/21 Javascript
vue-cli 默认路由再子路由选中下的选中状态问题及解决代码
2018/09/06 Javascript
微信小程序中使用echarts的实现方法
2019/04/24 Javascript
[55:47]DOTA2上海特级锦标赛C组小组赛#2 LGD VS Newbee第三局
2016/02/27 DOTA
Python中函数的用法实例教程
2014/09/08 Python
python根据url地址下载小文件的实例
2018/12/18 Python
django框架自定义模板标签(template tag)操作示例
2019/06/24 Python
在pycharm中显示python画的图方法
2019/08/31 Python
python中的itertools的使用详解
2020/01/13 Python
tensorflow指定GPU与动态分配GPU memory设置
2020/02/03 Python
Python3交互式shell ipython3安装及使用详解
2020/07/11 Python
巧克力领导品牌瑞士莲美国官网:Lindt Chocolate美国
2016/08/25 全球购物
英国珠宝钟表和家居礼品精品店:David Shuttle
2018/02/24 全球购物
职业技术学校毕业生推荐信
2013/12/03 职场文书
写好自荐信的几个要点
2013/12/26 职场文书
《傅雷家书》教学反思
2014/04/20 职场文书
2016公司年会通知范文
2015/04/25 职场文书
525心理健康活动总结
2015/05/08 职场文书
看看如何用Python绘制小米新版天价logo
2021/04/20 Python