使用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学习历程和心得小结
Aug 16 Javascript
基于jquery可配置循环左右滚动例子
Sep 09 Javascript
javascript 进阶篇1 正则表达式,cookie管理,userData
Mar 14 Javascript
浅谈javascript中的作用域
Apr 07 Javascript
js鼠标悬浮出现遮罩层的方法
Jan 28 Javascript
require.js的用法详解
Oct 20 Javascript
Bootstrap轮播插件中图片变形的终极解决方案 使用jqthumb.js
Jul 10 Javascript
React实现点击删除列表中对应项
Jan 10 Javascript
详解微信小程序入门五: wxml文件引用、模版、生命周期
Jan 20 Javascript
bootstrap jquery dataTable 异步ajax刷新表格数据的实现方法
Feb 10 Javascript
JS实现的合并两个有序链表算法示例
Feb 25 Javascript
vue在图片上传的时候压缩图片
Nov 18 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实现的AES双向加密解密功能示例【128位】
2018/09/03 PHP
Js+Dhtml:WEB程序员简易开发工具包(预先体验版)
2006/11/07 Javascript
Prototype使用指南之ajax
2007/01/10 Javascript
你需要知道的JavsScript可以做什么?
2007/06/29 Javascript
在JavaScript中,为什么要尽可能使用局部变量?
2009/04/06 Javascript
Pro JavaScript Techniques学习笔记
2010/12/28 Javascript
Web开发之JavaScript
2012/03/29 Javascript
innerHTML与jquery里的html()区别介绍
2012/10/12 Javascript
jquery插件推荐 jquery.cookie
2014/11/09 Javascript
JavaScript中对象介绍
2014/12/31 Javascript
jQuery使用deferreds串行多个ajax请求
2016/08/22 Javascript
javascript编写简易计算器
2017/05/06 Javascript
Vue.js 动态为img的src赋值方法
2018/03/14 Javascript
JavaScript中while循环的基础使用教程
2020/08/11 Javascript
[38:23]完美世界DOTA2联赛循环赛 FTD vs PXG BO2第二场 11.01
2020/11/02 DOTA
Python实现网站文件的全备份和差异备份
2014/11/30 Python
学习python之编写简单乘法口诀表实现代码
2016/02/27 Python
python下读取公私钥做加解密实例详解
2017/03/29 Python
python实现逻辑回归的方法示例
2017/05/02 Python
使用python进行拆分大文件的方法
2018/12/10 Python
Python CVXOPT模块安装及使用解析
2019/08/01 Python
Django项目创建到启动详解(最全最详细)
2019/09/07 Python
Python搭建HTTP服务过程图解
2019/12/14 Python
使用PyTorch将文件夹下的图片分为训练集和验证集实例
2020/01/08 Python
Tech21美国/加拿大:英国NO.1防摔保护壳品牌
2018/01/20 全球购物
澳大利亚厨房和家用电器购物网站:Bing Lee
2021/01/11 全球购物
七年级地理教学反思
2014/01/26 职场文书
项目施工员岗位职责
2014/03/09 职场文书
聚美优品励志广告词
2014/03/14 职场文书
高校群众路线教育实践活动剖析材料
2014/10/10 职场文书
幼儿园2014年度工作总结
2014/11/10 职场文书
2015年教研工作总结
2015/05/23 职场文书
班级元旦晚会开幕词
2016/03/04 职场文书
分享Python异步爬取知乎热榜
2022/04/12 Python
html中相对位置与绝对位置的具体使用
2022/05/15 HTML / CSS
鸿蒙3.0体验感怎么样? 鸿蒙3.0系统评测向
2022/08/14 数码科技