常見問題

透過集合功能整理內容 你可以依據偏好儲存及分類內容。

什麼是 WebP?使用自動標記的好處

WebP 是有損和無損壓縮的方法,可用於網路上大量的攝影、半透明和圖形圖片。 有損壓縮程度可調整,因此使用者可以選擇檔案大小和圖片品質之間的取捨。WebP 的平均壓縮量通常比 JPEG 和 JPEG 2000 高出 30%,且圖片品質不會下降 (請參閱比較研究)。

WebP 格式基本上是建立更小且美觀的圖片,協助提升網頁速度。

哪些網路瀏覽器原生支援 WebP?

如果網站管理員想要改善網站效能,可以輕鬆為目前的圖片建立最佳化 WebP 替代項目,並根據鎖定的目標提供 WebP 的瀏覽器來提供這些建議。

  • WebP 有損支援
    • Google Chrome (電腦版) 17 歲以上
    • Google Chrome Android 25 以上版本
    • Microsoft Edge 18 歲以上
    • Firefox 65 以上版本
    • Opera 11.10 以上版本
    • 原生網路瀏覽器、Android 4.0 以上版本 (ICS)
  • WebP 有損、無損與 Alpha 版支援
    • Google Chrome (電腦版) 23 以上版本
    • Google Chrome Android 25 以上版本
    • Microsoft Edge 18 歲以上
    • Firefox 65 以上版本
    • Opera 12.10 以上版本
    • 原生網路瀏覽器,Android 4.2 以上版本 (JB-MR1)
    • 26 歲以上的 Pale Moon
  • 支援 WebP 動畫
    • Google Chrome (電腦版和 Android 版) 32 以上版本
    • Microsoft Edge 18 歲以上
    • Firefox 65 以上版本
    • 19 歲以上

另請參閱維基百科 WebP 文章

如何偵測瀏覽器對 WebP 的支援?

因此,建議您只向可正常顯示這些圖片的用戶端提供 WebP 圖片,並在無法向用戶端使用舊版格式時,改用舊版格式。幸好,在用戶端和伺服器端都有偵測 WebP 支援的幾項技術。部分 CDN 供應商會在自家服務中提供 WebP 支援偵測。

透過 Accept 標頭進行伺服器端內容協商

網路用戶端通常會傳送「接受」的要求標頭,藉此指出他們願意接受的內容格式。如果瀏覽器提前指出它會「接受」 image/webp 格式,網路伺服器就知道它可以安全地傳送 WebP 圖片,大幅簡化內容協商。請點選下方連結以瞭解詳情。

Modernizer

Modernizr 是一個 JavaScript 程式庫,可讓您輕鬆偵測網路瀏覽器中的 HTML5 和 CSS3 功能支援。找出 Modernizr.webpModernizr.webp.lossless 屬性、Modernizr.webp.alphaModernizr.webp.animation 屬性。

HTML5 <picture> 元素

HTML5 支援 <picture> 元素,可讓您依優先順序列出多個替代圖片目標,以便用戶端要求可正常顯示的第一個候選圖片。請參閱有關 HTML5 Rocks 的討論<picture> 元素一律支援更多瀏覽器

使用自己的 JavaScript

另一個偵測方法則是嘗試將使用特定功能的極小 WebP 圖片解碼,並檢查是否有成功。範例:

// check_webp_feature:
//   'feature' can be one of 'lossy', 'lossless', 'alpha' or 'animation'.
//   'callback(feature, result)' will be passed back the detection result (in an asynchronous way!)
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 支援的程式碼都應放入回呼函式中。

Google 為什麼要將 WebP 以開放原始碼形式發布?

我們非常注重開放原始碼模型的重要性,透過開放原始碼的 WebP,所有人都能使用這種格式並提供建議。我們一直根據輸入內容和建議,我們認為 WebP 隨著時間變得越來越實用。

如何將個人圖片檔轉換為 WebP?

您可以使用 WebP 指令列公用程式,將個人圖片檔轉換為 WebP 格式。詳情請參閱使用 WebP

如果您有多個要轉換的圖片,可以使用平台的殼層來簡化作業。例如,如要轉換資料夾中的所有 jpeg 檔案,請按照下列步驟操作:

Windows:

> for /R . %I in (*.jpg) do ( cwebp.exe %I -o %~fnI.webp )

Linux / macOS:

$ for F in *.jpg; do cwebp $F -o `basename ${F%.jpg}`.webp; done

如何判斷自己的 WebP 圖片品質?

目前,您可以查看 WebP 檔案,方法是將其轉換為採用無損壓縮的通用格式 (例如 PNG),然後在任何瀏覽器或圖片檢視器中查看 PNG 檔案。如要快速瞭解 WebP 品質,請參閱這個網站的圖片庫,並列比較照片。

如何取得原始碼?

轉換器程式碼可在 WebP 開放原始碼專案頁面的下載部分取得。您可以在 WebM 網站上找到輕量解碼器的程式碼和 VP8 規格。如需容器規格,請參閱 RIFF 容器頁面。

WebP 圖片的大小上限為何?

WebP 與 VP8 相容,且寬度和高度使用 14 位元。 WebP 圖片的像素尺寸上限為 16383 x 16383。

WebP 格式支援哪些色域?

和 VP8 位元串流一致,有損 WebP 僅適用於 8 位元 Y'CbCr 4:2:0 (通常稱為 YUV420) 圖片格式。詳情請參閱 RFC 6386 VP8 資料格式與解碼指南 第 2 節 (「格式總覽」) 一文。

Lossless WebP 僅適用於 RGBA 格式。請參閱 WebP 無損 Bitstream 規格

WebP 圖片可以大於來源圖片嗎?

是,通常從有損格式轉換為 WebP 無損格式時,反之亦然。這主要是因為色彩空間差異 (YUV420 和 ARGB) 以及兩者之間的轉換作業。

一般情況有以下三種:

  1. 如果來源圖片採用無損 ARGB 格式,則將 YUV420 空間空間取樣作業導入新色彩,且會比原始色彩降低。如果發生這種情況,通常來源是 PNG 格式且僅有少量顏色:如果轉換為有損 WebP (或類似有損 JPEG 檔案),可能會導致檔案大小較大。
  2. 如果來源採用有損格式,使用無損 WebP 壓縮功能來擷取來源的有損性質,通常就會產生較大的檔案。這並不是 WebP 檔案,而是可以在將 JPEG 來源轉換為無損 WebP 或 PNG 格式時發生。
  3. 如果來源採用有損格式,且您嘗試以品質較高的壓縮格式壓縮。舉例來說,如果嘗試將品質為 80 的 JPEG 檔案轉換為品質為 95 的 WebP 檔案,則即使兩種格式都遺失,通常也會產生更大的檔案。 評估來源的品質通常不易,因此如果檔案大小在較大範圍內,建議降低目標 WebP 品質。另一種則是避免使用品質設定,請改用 cwebp 工具中的 -size 選項或對等 API 指定特定檔案大小。舉例來說,指定原始檔案大小的 80% 可能有助於產生更優異的效能。

請注意,如果將 JPEG 來源轉換為有損 WebP 或將 PNG 來源轉換為無損 WebP 檔案,不太可能是這種檔案大小意外。

WebP 是否支援漸進式或交錯螢幕?

WebP 不提供 JPEG 或 PNG 格式的漸進式或交錯解碼重新整理功能。這通常會導致解碼用戶端的 CPU 和記憶體產生過多壓力,因為每個重新整理事件都必須完整通過解壓縮系統。

將漸進式的 JPEG 圖像解碼平均等同於將基準解碼 3 次。

此外,WebP 也提供漸進式解碼,系統會運用所有位元串流可用的位元組位元組,盡可能盡快產生可顯示的範例資料列。這樣做能在用戶端儲存記憶體、CPU 和重新繪製作業,同時提供下載狀態的視覺化提示。進階解碼 API 會提供漸進式解碼功能。

如何在 Android 專案中使用 libwebp Java 繫結?

WebP 支援 JNI 繫結至 swig/ 目錄中簡單的編碼器和解碼器介面。

Eclipse 中建構程式庫:

  1. 確認您已連同 NDK 工具一併安裝 ADT 外掛程式,而且 NDK 路徑設定無誤 (Preferences > Android > NDK)。
  2. 建立新專案:檔案 > 新增 > 專案 > Android 應用程式專案
  3. 複製或解除封裝 libwebp 到新專案中名為 jni 的資料夾。
  4. swig/libwebp_java_wrap.c 新增至 LOCAL_SRC_FILES 清單。
  5. 在新專案上按一下滑鼠右鍵,然後選取「Android Tools」>「Add Native Support ...」,即可將其納入建構。
  6. 開啟專案屬性,然後前往 C/C++ Build > Behaviour。將 ENABLE_SHARED=1 新增至 Build (Incremental build) 區段,將 libwebp 建構為共用程式庫。

    注意:設定 NDK_TOOLCHAIN_VERSION=4.8 通常可改善 32 位元的建構效能。

  7. swig/libwebp.jar 新增至 libs/ 專案資料夾。

  8. 建構您的專案。這項操作會建立「libs/<target-arch>/libwebp.so」。

  9. 使用 System.loadLibrary("webp") 在執行階段載入程式庫。

請注意,您可以使用 ndk-build 和隨附的 Android.mk 手動建構程式庫。在這種情況下,您可以重複執行上述步驟。

如何搭配 C# 使用 libwebp?

您可以將 WebP 建構為可匯出 libwebp API 的 DLL。然後,這些函式就能以 C# 匯入。

  1. 建構 libwebp.dll。這將會正確設定 WEBP_EXTERN,以匯出 API 函式。

    libwebp> nmake /f Makefile.vc CFG=release-dynamic
    
  2. 將 libwebp.dll 新增至專案,並匯入所需函式。請注意,如果您使用簡易 API,應呼叫 WebPFree() 以釋放任何傳回的緩衝區。

    [DllImport("libwebp.dll", CallingConvention = CallingConvention.Cdecl)]
    static extern int WebPEncodeBGRA(IntPtr rgba, int width, int height, int stride,
                                     float quality_factor, out IntPtr output);
    [DllImport("libwebp.dll", CallingConvention = CallingConvention.Cdecl)]
    static extern int WebPFree(IntPtr p);
    
    void Encode() {
      Bitmap source = new Bitmap("input.png");
      BitmapData data = source.LockBits(
          new Rectangle(0, 0, source.Width, source.Height),
          ImageLockMode.ReadOnly,
          PixelFormat.Format32bppArgb);
      IntPtr webp_data;
      const int size = WebPEncodeBGRA(data.Scan0,
                                      source.Width, source.Height, data.Stride,
                                      80, out webp_data);
      // ...
      WebPFree(webp_data);
    }
    

使用 WebP 動畫有什麼好處?

相較於動畫 GIF,動畫 WebP 的優點

  1. 相較於 GIF 的 8 位元色彩和 1 位元 Alpha 版,WebP 支援 8 位元 Alpha 通道的 24 位元 RGB 顏色。

  2. WebP 支援有損和無損壓縮;事實上,單一動畫可以結合有損和無損頁框。GIF 僅支援無損壓縮。WebP' 有損壓縮技術適用於以實際影片為基礎的動畫圖片 (日益增加的動畫圖片來源)。

  3. WebP 所需的位元組少於 GIF1。動畫式 GIF 轉換成有損 WebP 的檔案大小會減少 64%,而無損 WebP 變小了 19%。這一點在行動網路上尤其重要。

  4. WebP 需要較少時間進行解碼,在「連結」中,捲動或變更分頁可以隱藏並顯示圖片,導致動畫暫停後指向另一個點。導致 CPU 使用動畫捨棄影格過多的情況,也可能需要解碼器在動畫中向前快轉。在這類情況下,動畫 WebP 總解碼時間是 GIF 的 0.57 倍2,因此在捲動期間可以減少資源浪費,同時快速恢復 CPU 使用率高峰。這是因為 WebP 與 GIF 有兩項優點:

    • WebP 圖片會儲存每個影格是否包含 Alpha 版的中繼資料,因此無需解碼影格以做出判斷。這可以更準確地推斷特定影格依賴的是哪些先前影格,進而減少之前影格的不必要的解碼作業。

    • 如同新型影片編碼器,WebP 編碼器會主動加入重要影格 (大多數 GIF 編碼器都不支援)。這項功能可大幅改善在長動畫中尋找歌曲的時間。為方便插入這類影格而不需大幅增加圖片大小,WebP 還會針對各個影格加上 'blending' 旗標。除了 GIF 使用,這可讓主要畫面格繪製為如同將整個圖片清除為背景顏色,而不強制使用前一個畫格。

與 GIFP 動畫相比,GIF 動畫的缺點

  1. 如果缺乏 Search Console 的直線解碼,CPU 的耗用量就高於 GIF。有損 WebP 的解碼時間是 GIF 的 2.2 倍,無損 WebP 需要 1.5 倍。

  2. WebP 支援幾乎不如 GIF 支援,因此相當普遍。

  3. 為瀏覽器新增 WebP 支援,增加程式碼足跡和攻擊面。在 Blink 中,這大約有 1500 行程式碼 (包括 WebP demux 程式庫和 Blink 端 WebP 圖片解碼器)。請注意,如果 WebP 和 WebM 共用較常見的解碼程式碼,或者 WebP' 的功能會排除在 WebM's 中,則日後可能會減少這個問題。

為什麼不直接在 <img> 支援 WebM?

長期支援 <img> 標記的影片格式。不過,在這種情況下,如果 <img> 中的 WebM 可以填入建議的 WebP 角色,就會發生問題:

  1. 解碼依賴先前影格的影格時,WebM 需要的記憶體數量會比動畫 WebP 多 50%,以保留先前的影格數量下限3

  2. 不同瀏覽器和裝置的影片轉碼器和容器支援大小不盡相同。為了協助自動內容轉碼 (例如為節省頻寬的 Proxy),瀏覽器必須新增接受標頭,指出圖片標記支援的格式。但這可能不足,因為 MIME 類型 (例如「video/webm」或「video/mpeg」) 仍然不代表轉碼器支援,例如 VP8 和 VP9。另一方面,WebP 格式有效被凍結,如果提供供應商的供應商同意發布 WebP 動畫,則所有通用 Analytics (分析) 的 WebP 行為應保持一致;且「image/webp」應接受標頭已用於表示 WebP 支援,因此無需變更新的接受標頭。

  3. Chromium 影片堆疊已針對流暢播放體驗進行最佳化,並假設一次只能播放一或兩部影片。因此,在採用系統資源 (執行緒、記憶體等) 時,該團隊採取積極的措施,以盡可能提高播放品質。這種實作方式並不適用於許多同時錄影的影片,因此必須重新設計,適合與有大量圖片的網頁搭配使用。

  4. WebM 目前不支援整合 WebP 的所有壓縮技術。因此,與替代圖片相比,這張圖片的 WebP 壓縮效果更好:


1 針對動畫 GIF 和 WebP 動畫之間的所有比較,我們使用大約 7, 000 張從網頁隨機擷取動畫 GIF 圖片的語料庫。 這些圖片使用 'gif2webp' 以預設設定進行轉換 (以 2013 年 10 月 8 日最新的 libwebp 原始碼樹狀結構建構而成)。比較數字是這些圖片的平均值。

2 截至 2013 年 10 月 8 日為止,系統會使用基準工具使用最新的 libwebp + ToT Blink 來解碼解碼時間。「使用要搜尋的解碼時間」的計算方式為「解碼前五個影格、清除影格緩衝區快取、接下來的五個影格解碼等。」

3 WebM 在記憶體中會保留 4 個 YUV 參照影格,每個影格的大小 (寬度 + 96)*(高度 + 96) 像素。對於 YUV 4:2:0,我們每 6 像素需要 4 個位元組 (或每個像素 3/2 個位元組)。因此,這些參照頁框使用 4*3/2*(width+96)*(height+96) 個位元組的記憶體。另一方面,WebP 只需要前一個影格 (RGBA) 即可使用,也就是 4*width*height 位元組的記憶體。

4 如要使用 WebP 轉譯功能,必須使用 Google Chrome 32 以上版本