1. 程式人生 > 其它 >扒一扒“WEBP格式”的圖片

扒一扒“WEBP格式”的圖片

HTML5學堂:谷歌於2010年推出的新一代圖片格式 —— WEBP,隨著移動網際網路的發展,WEBP格式在2015年逐漸的開始被大公司部分採用。本文主要除了比較WEBP與JPG等傳統格式的圖片之外,還介紹瞭如何轉換WEBP格式圖片以及具體開發時的用法。

使用WEBP圖片的目的

保證圖片質量的前提下縮小圖片體積。JPEG、PNG以及GIF這些格式的圖片已經沒有太大的優化空間。但是,WebP圖片格式給圖片優化提供了另一種可能

圖片壓縮

無失真壓縮的圖片格式

TIFF;GIF;RAW;PCX;TAG;PNG;BMP

有失真壓縮格式

JPEG;JPG;WMF

WEBP圖片對壓縮的支援

WebP是一種支援有失真壓縮和無失真壓縮的圖片檔案格式(也支援alpha通道,動畫演示),根據Google的測試,無失真壓縮後的WebP比PNG檔案少了26%的體積,有失真壓縮後的WebP圖片相比於等效質量指標的JPEG圖片減少了25%~34%的體積。

WEBP的相容情況

谷歌、歐朋、移動端的谷歌核心瀏覽器(移動端蘋果不支援)

WEBP與JPG的比較

WebP與JPG相比較,編碼速度慢10倍,解碼速度慢1.5倍

通過同樣質量的WebP與JPG圖片載入的速度進行測試。測試的JPG和WebP圖片大小如下:

WebP雖然會增加額外的解碼時間,但由於減少了檔案體積,縮短了載入的時間,頁面的渲染速度加快了。同時,隨著圖片數量的增多,WebP頁面載入的速度相對JPG頁面增快了。所以,使用WebP基本沒有技術阻礙,還能帶來效能提升以及頻寬節省。

如何轉換WEBP格式的圖片

iSparta軟體

下載地址:http://isparta.github.io/index.html

線上生成:

智圖:http://zhitu.isux.us/

如何實現全瀏覽器相容

此處的相容,指的是讓高階瀏覽器載入WEBP格式的圖片,而不支援WEBP的瀏覽器載入原格式圖片。

方案1:引入flash

引入成本太高而且轉為flash之後圖片不能再操作,缺少靈活性,同時又會佔用過多的CPU。

方案2:同時提供兩套圖片

1. 具體實現方法 - 伺服器端:

服務端方式服務端就只能通過UA資訊來判斷。針對不同瀏覽器提供不同檔案。(https://github.com/igrigorik/webp-detect)

2. 具體實現方法 - JS前端:

檢測WEBP的支援程度

JavaScript檢測是否支援WebP程式碼如下:

function check_webp_feature(feature, callback) {
    var kTestImages = {
        lossy: "UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA",
        lossless: "UklGRhoAAABXRUJQVlA4TA0AAAAvAAAAEAcQERGIiP4HAA==",
        alpha: "UklGRkoAAABXRUJQVlA4WAoAAAAQAAAAAAAAAAAAQUxQSAwAAAARBxAR/Q9ERP8DAABWUDggGAAAABQBAJ0BKgEAAQAAAP4AAA3AAP7mtQAAAA==",
        animation: "UklGRlIAAABXRUJQVlA4WAoAAAASAAAAAAAAAAAAQU5JTQYAAAD/////AABBTk1GJgAAAAAAAAAAAAAAAAAAAGQAAABWUDhMDQAAAC8AAAAQBxAREYiI/gcA"
    };
    var img = new Image();
    img.onload = function () {
        var result = (img.width > 0) && (img.height > 0);
        callback(feature, result);
    };
    img.onerror = function () {
        callback(feature, false);
    };
    img.src = "data:image/webp;base64," + kTestImages[feature];
}

在瀏覽器向伺服器發起請求時,對於支援WebP圖片的瀏覽器,會在請求頭Accept中帶上image/webp的資訊,伺服器便能識別到瀏覽器是否支援WebP,在伺服器中處理圖片。

使用前端實現WEP的案例

考慮到不少開發人員沒有後臺操作許可權,因此利利在此利用JS,書寫了一個模擬性案例。原理和後臺比較相似:提供好兩種圖片,之後檢測瀏覽器是否支援WEP,如果支援則載入WEP格式的圖片,如果不支援則載入原格式圖片。

具體程式碼如下:

<!doctype html>
<html>
<head>
    <meta charset="UTF-8">
    <title>HTML5學堂 - H5course</title>
    <meta name="viewport" content="width=device-width,user-scalable=no">
</head>
<body>
    <div class="wrap">
        <img src="" webpsrc="images/1.webp" normalsrc="images/1.jpg" alt="" title="">
        <img src="" webpsrc="images/2.webp" normalsrc="images/2.jpg" alt="" title="">
    </div>
    <script>
        function check_webp_feature(feature, callback) {
            var kTestImages = {
                // 有損 - lossy; 無損 - lossless
                lossy: "UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA",
                lossless: "UklGRhoAAABXRUJQVlA4TA0AAAAvAAAAEAcQERGIiP4HAA==",
                alpha: "UklGRkoAAABXRUJQVlA4WAoAAAAQAAAAAAAAAAAAQUxQSAwAAAARBxAR/Q9ERP8DAABWUDggGAAAABQBAJ0BKgEAAQAAAP4AAA3AAP7mtQAAAA==",
                animation: "UklGRlIAAABXRUJQVlA4WAoAAAASAAAAAAAAAAAAQU5JTQYAAAD/////AABBTk1GJgAAAAAAAAAAAAAAAAAAAGQAAABWUDhMDQAAAC8AAAAQBxAREYiI/gcA"
            };
            var img = new Image();
            img.onload = function () {
                var result = (img.width > 0) && (img.height > 0);
                 callback(feature, result);
            };
            img.onerror = function () {
                callback(feature, false);
            };
            img.src = "data:image/webp;base64," + kTestImages[feature];
        }
        var imgs = document.getElementsByTagName('img');
        check_webp_feature('lossy', function(feature, result){
            if (result) {
                console.log('支援' + feature + '的壓縮方式');
                for (var i = 0; i < imgs.length; i++) {
                    imgs[i].setAttribute('src', imgs[i].getAttribute('webpsrc'));
                };
 
            } else {
                console.log('不支援' + feature + '的壓縮方式');
                for (var i = 0; i < imgs.length; i++) {
                    imgs[i].setAttribute('src', imgs[i].getAttribute('normalsrc'));
                };
            }
        })
 
    </script>
</body>
</html>

支援WEBP格式的谷歌瀏覽器,載入webp格式的兩張圖片

不支援WEBP格式的火狐瀏覽器,載入的是jpg格式的兩張圖片

大面積應用WEBP存在的問題(目前實際使用最大的痛點)

1. 伺服器儲存空間,我們不能拋棄原有格式,那麼儲存的資料量將會增加60%

2. 如果請求時再轉換,由於目前轉碼的效率太低,特別的大檔案的PNG速度很慢

WEBP應用場景推薦

在網路上查閱資料時,看到的WEBP應用場景推薦(即無需考慮相容的場景)

1. 客戶端軟體,內嵌了基於Chromium(chrome瀏覽器背後的引擎)的webview,這類瀏覽器中應用的網頁是可以完全使用webp格式,提升載入渲染速度,不考慮相容。

2. 用node-webkit開發的程式,用webp可以減少檔案包的體積。(開發桌面+WEB混合型應用)

3. 移動應用或移動端網頁遊戲,介面需要大量圖片,可以嵌入webp的解碼包,能夠節省使用者流量,提升訪問速度

HTML5小編-利利 耗時10h