不同的動圖-APNG

動圖

說到動圖,首先咱們想到的 GIF 格式,GIF 在網絡上流行已久,各類動態表情包都是 GIF 圖作的。
可是 GIF 的缺點也很明顯,透明背景的 GIF 沒法作到像素的絕對平滑過分,因而乎咱們能夠看到帶透明的 GIF 圖周圍雜邊很是明顯,以下:javascript

不同的動圖-APNG

一般解決這種問題是在外面加上一圈白色的描邊,這樣在白色背景下能夠掩蓋雜邊問題,可是在深色背景下依然無解:html

不同的動圖-APNG

APNG 完美的解決了這個問題。java

APNG

APNG 全稱是 Animated Portable Network Graphics , 是 PNG 格式的動畫擴展。APNG 的第1幀爲標準PNG圖像,剩餘的動畫和幀速等數據放在PNG擴展數據塊裏。這裏有點相似於視頻的關鍵幀,關鍵幀有完整的圖像信息,而兩個關鍵幀之間只保留了變化的信息。git

簡單來講,APNG 支持全綵和透明,無雜邊問題,如絲般潤滑:程序員

不同的動圖-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 啊!微信

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…

相關文章
相關標籤/搜索