說到動圖,首先咱們想到的 GIF 格式,GIF 在網絡上流行已久,各類動態表情包都是 GIF 圖作的。
可是 GIF 的缺點也很明顯,透明背景的 GIF 沒法作到像素的絕對平滑過分,因而乎咱們能夠看到帶透明的 GIF 圖周圍雜邊很是明顯,以下:javascript
一般解決這種問題是在外面加上一圈白色的描邊,這樣在白色背景下能夠掩蓋雜邊問題,可是在深色背景下依然無解:html
APNG 完美的解決了這個問題。java
APNG 全稱是 Animated Portable Network Graphics , 是 PNG 格式的動畫擴展。APNG 的第1幀爲標準PNG圖像,剩餘的動畫和幀速等數據放在PNG擴展數據塊裏。這裏有點相似於視頻的關鍵幀,關鍵幀有完整的圖像信息,而兩個關鍵幀之間只保留了變化的信息。git
簡單來講,APNG 支持全綵和透明,無雜邊問題,如絲般潤滑:程序員
不過,APNG 的標準化之路至關坎坷,2004年創立以來,知道今天依然沒能被納爲 PNG 的標準。不過真金不怕紅爐火,酒香不怕巷子深,愈來愈多的軟件開始支持 APNG,也有不少開源庫可讓咱們用上 APNG。github
Android 上有APNG View 等,iOS 上有 APNGKit 等。canvas
而 Web 上,Firfox 和 Safari 是支持 APNG 的,不過 Chrome 不支持。 Chrome 支持本身的親兒子 WebP,不支持 APNG,而蘋果支持 APNG,不支持 WebP,真是好任性,能夠一人讓一步都支持嗎?瀏覽器
不過,Web 上想用 APNG 仍是有辦法的,咱們有強大的 Canvas 啊!微信
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 什麼渲染之類的活就所有幫咱們作完了,簡直是太方便了,太方便了(口水已經流出來了)。
效果以下:
這裏錄的可能不是很清晰,推薦直接訪問線上 Demo:
已經有不少工具能夠製做 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…