使用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 相关文章推荐
滚动经典最新话题[prototype框架]下编写
Oct 03 Javascript
input+select(multiple) 实现下拉框输入值
May 21 Javascript
jQuery 顺便学习下CSS选择器 奇偶匹配nth-child(even)
May 24 Javascript
查看源码的工具 学习jQuery源码不错的工具
Dec 26 Javascript
点击进行复制的JS代码实例
Aug 23 Javascript
通过url查找a元素并点击
Apr 09 Javascript
JavaScript限定图片显示大小的方法
Mar 11 Javascript
jQuery创建自定义的选择器用以选择高度大于100的超链接实例
Mar 18 Javascript
jsMind通过鼠标拖拽的方式调整节点位置
Apr 13 Javascript
整理JavaScript对DOM中各种类型的元素的常用操作
May 05 Javascript
使用jQuery Mobile框架开发移动端Web App的入门教程
May 17 Javascript
vue中的router-view组件的使用教程
Oct 23 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
解决GD中文乱码问题
2007/02/14 PHP
php fsockopen中多线程问题的解决办法[翻译]
2011/11/09 PHP
在Win7 中为php扩展配置Xcache
2014/10/08 PHP
ThinkPHP安装和设置
2015/07/27 PHP
PHP用FTP类上传文件视频等的简单实现方法
2016/09/23 PHP
TP(thinkPHP)框架多层控制器和多级控制器的使用示例
2018/06/13 PHP
PHP-FPM 设置多pool及配置文件重写操作示例
2019/10/02 PHP
jquery $.ajax各个事件执行顺序
2010/10/15 Javascript
jQuery学习笔记 操作jQuery对象 文档处理
2012/09/19 Javascript
jquery实现树形二级菜单实例代码
2013/11/20 Javascript
JavaScript 事件对象介绍
2015/04/13 Javascript
深入分析Javascript事件代理
2016/01/30 Javascript
Vue.js 2.0 移动端拍照压缩图片上传预览功能
2017/03/06 Javascript
关于vue.js v-bind 的一些理解和思考
2017/06/06 Javascript
javascript自定义事件功能与用法实例分析
2017/11/08 Javascript
vue2.0 如何把子组件的数据传给父组件(推荐)
2018/01/15 Javascript
[03:35]2018年度DOTA2最佳辅助位选手5号位-完美盛典
2018/12/17 DOTA
python的三目运算符和not in运算符使用示例
2014/03/03 Python
Python实现批量下载文件
2015/05/17 Python
Python中利用Scipy包的SIFT方法进行图片识别的实例教程
2016/06/03 Python
django ajax json的实例代码
2018/05/29 Python
Python基于Tkinter模块实现的弹球小游戏
2018/12/27 Python
用Cython加速Python到“起飞”(推荐)
2019/08/01 Python
python同步windows和linux文件
2019/08/29 Python
keras导入weights方式
2020/06/12 Python
python如何将图片转换素描画
2020/09/08 Python
Python使用grequests并发发送请求的示例
2020/11/05 Python
Html5页面获取微信公众号的openid的方法
2020/05/12 HTML / CSS
Html5在手机端调用相机的方法实现
2020/05/13 HTML / CSS
波兰办公用品和学校用品在线商店:Dlabiura24.pl
2020/11/18 全球购物
创业者是否需要商业计划书?
2014/02/07 职场文书
乌鸦喝水教学反思
2014/02/07 职场文书
2014年小学校长工作总结
2014/12/08 职场文书
检讨书之工作不认真
2019/08/14 职场文书
《亲亲我的妈妈》观后感(3篇)
2019/09/26 职场文书
Nginx四层负载均衡的配置指南
2021/06/11 Servers