壓縮gif的正確姿式

有時候,咱們有壓縮gif的需求——例如爲了優化網頁加載速度。在unix環境下,可使用ImageMagick工具。算法

壓縮gif使用-layers方法Optimizesegmentfault

convert source.gif -layers Optimize dest.gif

惋惜的是,以上的命令只適用於卡通類的gif……若是你的gif是從錄製的視頻轉化而來的,一般壓縮不了多少,甚至可能比原文件更大。這是爲何呢?工具

Optimize

要知道這是爲何,咱們先看看這個Optimize到底作了哪些事情?優化

  1. Coalesce 動畫
  2. 基本幀優化
  3. 透明度優化

Coalesce

gif的每一幀,有一部分元素是和前一幀相同的,所以保存的時候,每一幀一般不是完整的畫面,而一個較小的區塊(這個區塊包括了改變的部分),這樣能夠壓縮尺寸。動畫

例如,上面一幀gif,背景是不變的,因此實際儲存的時候,每一幀多是這樣的:spa

Coalesce就是將這些動畫還原成完整的一幀一幀畫面,方便後期的處理。unix

基本幀優化

Coalesce以後的圖像,從新計算、生成新的幀。這個過程能夠說是「螺旋式地前進」,看起來是抵消了coalesce,其實在從新計算、生成的過程當中,使用的算法、參數可能比原圖的更好,所以最終能夠壓縮體積。這就是基本幀優化。code

透明度優化

gif的幀和幀之間,有不少顏色是同樣的。因此,咱們能夠將這些顏色一致的區域視做背景,保存下一幀的時候,和背景重合的像素都保存爲透明像素,這樣就能夠省去保存不少與背景像素如出一轍的像素的色彩信息。視頻

例如,上面的gif圖像,後面的幾幀,四邊使用透明像素:class

加大透明區域,就能夠省去更多重複的色彩信息,從而進一步壓縮尺寸,這就是透明度優化。

透明度優化的侷限

上面說了,對於視頻轉化而來的gif,壓縮的效果很差。緣由就是透明度優化環節出了問題。

視頻轉化而來的gif,背景可能會有輕微的抖動,同時,視頻的每一幀畫面採用了有損壓縮,相近的顏色會被壓縮爲同一種顏色,所以一樣的顏色,在不一樣的幀裏面可能會被近似成不一樣的顏色。這兩個因素就致使透明度優化效果不好。因爲透明度優化是一個很是複雜的過程,牽涉到LZW壓縮算法,所以這種狀況下,優化可能反而使得LZW壓縮的選擇變差。因此最終優化過的gif,大小就和原圖差很少,甚至更大。

解決方案

一旦咱們弄明白了緣由,那麼解決方案就很顯然了:優化的時候,將相近的顏色視爲相同的顏色,這樣就能夠抵消抖動和色彩壓縮的影響。這經過設置fuzz因子來達成:

convert test.gif -fuzz 15% -layers Optimize result.gif

-fuzz選擇多少能取得最大的壓縮效果,同時對畫質的影響能夠接受,則須要耐心地嘗試。

注意:以上的方案是假定你只有gif文件,可是若是你有視頻原文件的話,就是另外一回事了。

相關文章
相關標籤/搜索