动图

说到动图,首先我们想到的 GIF 格式,GIF 在网络上流行已久,各种动态表情包都是 GIF 图做的。
但是 GIF 的缺点也很明显,透明背景的 GIF 无法做到像素的绝对平滑过度,于是乎我们可以看到带透明的 GIF 图周围杂边非常明显,如下:

不一样的动图-APNG

通常解决这种问题是在外面加上一圈白色的描边,这样在白色背景下可以掩盖杂边问题,但是在深色背景下依然无解:

不一样的动图-APNG

APNG 完美的解决了这个问题。

APNG

APNG 全称是 Animated Portable Network Graphics , 是 PNG 格式的动画扩展。APNG 的第1帧为标准PNG图像,剩余的动画和帧速等数据放在PNG扩展数据块里。这里有点类似于视频的关键帧,关键帧有完整的图像信息,而两个关键帧之间只保留了变化的信息。

简单来说,APNG 支持全彩和透明,无杂边问题,如丝般润滑:

不一样的动图-APNG

不过,APNG 的标准化之路相当坎坷,2004年创立以来,知道今天依然没能被纳为 PNG 的标准。不过真金不怕红炉火,酒香不怕巷子深,越来越多的软件开始支持 APNG,也有很多开源库可以让我们用上 APNG。

Android 上有APNG View 等,iOS 上有 APNGKit 等。

而 Web 上,Firfox 和 Safari 是支持 APNG 的,不过 Chrome 不支持。 Chrome 支持自己的亲儿子 WebP,不支持 APNG,而苹果支持 APNG,不支持 WebP,真是好任性,可以一人让一步都支持吗?

不过,Web 上想用 APNG 还是有办法的,我们有强大的 Canvas 啊!

Canvas & APNG

Web 上我们用 Canvas 来渲染 APNG,主要用到一个开源库 apng-canvas

简单写了个 Demo :

html如下:

<body><img class="apng" id="apng-basketball" src="./apng-basketball.png"><div><img src="./elephant.gif"><img class="apng" id="apng-elephant" src="./elephant.png"></div><div><div class="color-item" style="background-color:red"></div><div class="color-item" style="background-color:yellow"></div><div class="color-item" style="background-color:black"></div><div class="color-item" style="background-color:white"></div></div><script type="text/javascript" src="./apng-canvas.min.js"></script>
</body>复制代码

比较简单,这里用了两张 APNG 图片和一张 GIF 图,下面写了几个 div 用来改变背景色。最后引入了 apng-canvas 这个库。

javascript代码如下:

    var imgs = document.querySelectorAll(".apng");APNG.ifNeeded().then(function(){for (var i=0; i < imgs.length; i++) {APNG.animateImage(imgs[i]);};});var colorItems = document.querySelectorAll(".color-item");for (var i=0; i < colorItems.length; i++) {colorItems[i].onclick = function(){var color = this.style.backgroundColor;document.body.style.backgroundColor = color;}};复制代码

代码很简单,APNG 这个对象就是 apng-canvas 这个库提供的,ifNeeded() 函数用来判断浏览器是否支持APNG,如果支持,后面的事情我们就不用干了。

APNG.animateImage(imgs[i]); 这里传入一个 Image Element,之后什么插入 Canvas 什么渲染之类的活就全部帮我们做完了,简直是太方便了,太方便了(口水已经流出来了)。

效果如下:

不一样的动图-APNG

这里录的可能不是很清晰,推荐直接访问线上 Demo:

imbeta.cn/demo/apng/a…

制作APNG

已经有很多工具可以制作 APNG 了,可以参考张鑫旭大大的博客APNG历史、特性简介以及APNG制作演示 以及 littlesvr.ca/apng/。

另外,我们组也有一款 APNG 制作和压缩工具,isparta,制作人是 jeakeyliang 和 hahnzhu 。

在说几句关于和 GIF 体积的比较,无损 APNG 大概是比 GIF 稍微大一点,有损压缩之后,APNG 可以比 GIF 小约 30% 而且也没有杂边问题。

另外,Line 的的动态贴图,还有 iOS 10 iMessage 中的各种动态表情也都是使用 APNG 的,看来前途还是光明的嘛。


Demo 的源码地址:
github.com/bob-chen/ca…

碎碎念

最近总想记录一些所思所想,写写科技与人文,写写生活状态,写写读书感悟,昨天终于动笔,在微信公众号上写,主要是扯淡和感悟,欢迎关注,交流。

微信公众号:程序员的诗和远方

公众号ID : MonkeyCoder-Life

参考

davidmz.github.io/apng-canvas…

www.zhangxinxu.com/wordpress/2…

isux.tencent.com/introductio…

www.zhihu.com/question/27…

不一样的动图-APNG相关推荐

  1. 前端vs图片4 apng 前端动图的新姿势

    之前我们怎么做帧动画 首先需要排除掉gif 前文所说,gif只支持8位数,而且因为不支持半透明会出现锯齿,因此需要高色彩的动画的话,gif是不能够用的 通过js方法,逐帧轮询 将图片制作成雪碧图,js ...

  2. cesium加载动图方案三:通过apng-js库实现

    1.项目场景 实际开发中我们经常会有动图加载的需求,而Cesium不支持纹理贴动图,怎么样基于Cesium实现动图的加载,值得我们研究一波.cesium加载gif格式的动图有些场景能够满足我们的需求, ...

  3. 用FFmpeg制作WebP动图

    去年写过一篇文章,是教大家用FFmpeg制作GIF动画的.今天在讨论到项目中碰到的一个.apng动画素材引起的程序崩溃时,有位同学建议:我们为啥不用WebP来代替.apng?是啊,why not? 网 ...

  4. 如何把 GIF 动图保存到相册?

    为什么80%的码农都做不了架构师?>>>    https://blog.csdn.net/u012681458/article/details/52883163 例子 iOS 8以 ...

  5. html 语言 gif 动画,动效篇(1)--从简单CSS3动画片段代码,到生成gif动图~

    简单css动画片段代码(最终效果 ) (一)请自行下载安装Dreamweaver 在Dreamweaver编写代码(如需参考请复制下列代码) (二)HTML CSS代码详解css代码(/*详解*/) ...

  6. python 加载动图_在浏览器中使用TensorFlow.js和Python构建机器学习模型(附代码)...

    大数据文摘授权转载自数据派THU 作者:MOHD SANAD ZAKI RIZVI 本文主要介绍了: TensorFlow.js (deeplearn.js)使我们能够在浏览器中构建机器学习和深度学习 ...

  7. 十大经典排序算法Python版实现(附动图演示)

    来源:大数据DT 本文约5200字,建议阅读10分钟 排序算法是<数据结构与算法>中最基本的算法之一.本文介绍10种常见的内部排序算法,及如何用Python实现. 排序算法可以分为内部排序 ...

  8. 这个神了,一目了然,确实好,看小姐姐用动图展示10大Git命令

    选自dev.to  作者:Lydia Hallie 机器之心编译  参与:Panda.杜伟 git merge.git rebase.git reset.git revert.git fetch.gi ...

  9. 10张 GIF 动图让你弄懂递归等概念

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:深度学习这件小事 今天为大家整理了十张动图GIFS,有助 ...

最新文章

  1. ProjectEuler 4
  2. 精通python爬虫框架-精通Python爬虫框架Scrapy
  3. mysql的数据类型——待写
  4. 2022年有哪些值得学习的Java开源项目?这7个火爆了
  5. python-socket2
  6. 耍小聪明的人,永远不可能取得自己事业的成功
  7. php注册 绑定的容器,php – 将Eloquent模型绑定到服务容器
  8. livedata mvvm_Android MVVM LiveData数据绑定
  9. 【Caffe安装】Caffe安装(无GPU)--wanglei
  10. cve2018 linux内核提权漏洞,CVE-2018-18955:较新Linux内核的提权神洞分析
  11. Pawn Storm网络间谍行动再度现身
  12. Adobe Flash CS4 序列号-Adobe Dreamweaver CS4 序列号
  13. 获取西刺代理IP构建代理池
  14. 标签、画像设计与模型落地
  15. 基于 IPO 经济理论模型对目前 ICO 的理论研究和分析
  16. 百度站点Logo权限获取与使用说明
  17. 批量添加文件名前后缀的工具_艾孜尔江撰
  18. 牛客IOI周赛17-普及组 数列统计(组合数)
  19. python生成泊松分布随机数_Python-Numpy-Poisson分布
  20. 误删c盘user文件夹后,如何恢复文件

热门文章

  1. 【大数据实时数据同步】超级详细的生产环境OGG(GoldenGate)12.2实时异构同步Oracle数据部署方案(中)
  2. 【STM32】看门狗模块
  3. redis telnet连接失败,java连接超时 个人解决方法
  4. “OneFlow U” 2020年度社区之星——吴文童
  5. python中统计各个单词出现的次数使用方法_python统计文章中单词出现次数实例
  6. 【算法】【递归与动态规划模块】斐波那契数列的系列问题解法及递推类型问题的最优解
  7. 3.JFreeChart线型图
  8. 前端经典面试题:js必懂的原型和原型链
  9. yolo源码解析(1):代码逻辑
  10. 最完整的!WinForm使用ICSharpCode.TextEditor控件实现自定义高亮显示