跳到主要內容
黯羽輕揚每天積累一點點

前端開發需要了解的圖像知識

免費2015-11-29#CSS#Front-End#真彩色图像#调色板图像格式#alpha通道#逐行扫描#隔行扫描#优化雪碧图#css sprite优化#palette PNG

介紹常見的圖像術語,GIF、PNG、JPEG、WebP 等圖像格式的特點,以及 CSS Sprite 優化原則

##一.圖像術語

###圖形和照片

  • 圖形

網站的 logo、草圖、圖表、大部分動畫和圖示都屬於圖形。這些圖像通常由連續的線條或其他尖銳的顏色過渡組成,顏色數量相對較少

  • 照片

照片通常有百萬數量級的顏色,並且包含平滑的顏色過渡和漸變,想象一下用相機拍攝的日落時的照片。繪畫作品的圖像(比如蒙娜麗莎的微笑)更接近於照片,而不是圖形

就圖像格式而言,GIF 通常用來顯示圖形,而 JPEG 更適合顯示照片。PNG 兩者都適合,甚至用調色盤 PNG(palette PNG)顯示圖形比 GIF 會更好一些

###像素和 RGB

圖像由像素組成,像素是圖像中最小的資訊單元。我們可以使用不同的顏色模型來描述像素,在電腦圖像處理上,RGB 顏色模型是最常用的一種

在 RGB 顏色模型中,採用包含紅(R)、綠(G)和藍(B)的數量多少的方式來描述一個像素。R、G 和 B 被稱為成分(又稱為通道),每種成分的強度值範圍在 0-255 之間。我們經常在 HTML 和 CSS 中使用的是十六進位的成分值,範圍從 00~FF。將不同強度的成分組合在一起,就可以獲得不同的顏色。比如:

  • 紅色是 rgb(255, 0, 0) 或十六進位的 #FF0000

  • 藍色是 rgb(0, 0, 255) 或十六進位的 #0000FF

  • 灰色陰影很可能有著三個相同的成分值,比如,rgb(238, 238, 238) 或十六進位的 #EEEEEE

###真彩色圖像和調色盤圖像格式

使用 RGB 顏色模型到底可以展現多少種不同的顏色呢?答案是 1600 萬種:256*256*256(或者 2 的 24 次方)可以得到 16777216 種組合。可以支援這麼多顏色的圖像格式叫做真彩色圖像格式,比如 JPEG 和真彩色類型的 PNG

為了在存儲圖像資訊時節省一些空間,有一項技術是將圖像中各種不同的顏色提取出來建立一個表,這個表通常叫做調色盤(也可以稱為索引)。有了這個顏色表,就可以透過將調色盤中的條目和每個像素重新匹配,達到重新繪製整個圖像的目的

調色盤可以包含任意 RGB 顏色值,但是最經常使用的調色盤圖像格式——GIF 和 PNG8 都會限制調色盤中最多只能包含 256 種顏色。這不是說你只可以從 256 種已經定義好的顏色中選擇,恰恰相反,你可以從 1600+ 萬的顏色中選擇你需要的值,但是單個圖像中最多只能包含 256 種顏色

###透明和 alpha 通道(RGBA)

RGBA 並非另一種截然不同的顏色模型,而是在 RGB 基礎上做了擴充,額外的成分 A 代表 alpha 透明,值的範圍也是從 0~255,但實際上不同的程式和庫會將透明定義為從 0%~100% 的百分比,或者從 0-127 的值。alpha 通道描述了透過圖像像素可以看到下面內容的程度

假設已經做出了一個網頁,設置了背景,並在上面放置了一個藍色的圖像。如果圖像上某個像素的透明度設置為 0,那麼該像素下面的背景就不可見。如果 alpha 透明度設置為最大值 100%,那麼圖像上的像素將會隱藏,而背景則會「浮現出來」。假如設置為中間值,比如 50%,就可以同時看到背景和圖像上的像素

###交錯掃描

當網速很慢時,大圖像會隨著下載的進度逐行顯示,從上到下每顯示一行,緩慢地向下遞進,為了提高使用者體驗,部分圖像格式支援對那些連續採樣的圖像進行交錯掃描。交錯掃描可以讓使用者在完整下載圖像之前,看到圖像的一個粗略版本,從心理上消除頁面被延遲載入的感覺

##二.不同圖像格式的特性

GIF、JPEG 和 PNG 這 3 種格式的區別:

###GIF

圖形交換格式(Graphics Interchange Format)的縮寫,是一種調色盤圖像格式,有以下特性:

  • 透明

GIF 允許一個二進位(是/否)類型的透明度,每個像素要麼是完全透明的(不包含顏色),要麼是完全不透明的(包含一個單色)。這就意味著它不支援 alpha(可變的)透明,取而代之的是,調色盤中的某個顏色可以被標記為表示透明,而透明像素則會被分配為這個顏色值。所以,如果你為 GIF 設置了透明像素,那麼就會「消耗」一個調色盤項目

  • 動畫
GIF 格式支援動畫,包含動畫的圖像由若干幀組成,就像幾個圖像同時包含在一個文件中一樣,大家普遍認為 GIF 動畫很煩人,這是因為在網路發展初期它被濫用了,那時候大家用 GIF 來製作閃爍文字、旋轉的 @ 標誌等等。GIF 動畫現在是有一些應用,比如廣告條(雖然現在這已經主要是 Flash 的天下了),還有在富網際網路(RIAs)應用中出現的「載入中」指示符
  • 無損

GIF 是無損的,也就是說你可以打開任意一個 GIF 文件,做一些修改,保存關閉時不會損失任何品質

  • 逐行掃描

當生成 GIF 文件時,會使用一個壓縮演算法(叫做 LZW)來減小文件的大小。當壓縮 GIF 時,會從上到下一行一行的對像素進行掃描,這種情況下,當圖像在水平方向有很多重複顏色時,可以獲得更好的壓縮效果。比如,有一個 500*10 像素的圖像(寬 500px 高 10px),圖像上包含一些條紋,就是說水平方向是由相同顏色線條組成的,將這個圖像旋轉 90 度後(寬 10px 高 500px),其垂直方向是由相同顏色的條紋組成的,此時後者的文件要大於前者

  • 交錯掃描

GIF 支援可選的交錯掃描

由於 GIF 有 256 色的限制,所以不適合用來顯示照片,照片所需的顏色數量遠大於這個數量級。GIF 更適合用來顯示圖形(圖示、logo 和圖表),但 PNG8 是用來顯示圖形的最佳格式,所以,只有在需要動畫時才應該用 GIF

GIF 格式中使用的 LZW 無損數據壓縮演算法,在以前是受專利保護的,但是這個專利在 2004 年過了保護期,現在已經可以自由使用 GIF 了

###JPEG

JPEG 的意思是聯合圖像專家小組(Joint Photographic Experts Group),也就是開發了這個標準的組織名稱,JPEG 是照片存儲的實際標準。考慮到人類眼睛對顏色和光線強弱的感知,這種格式透過各種技術來減少顯示圖片所必需的資訊,所以它能在經過高度壓縮的文件中存儲高解析度的圖像,有以下特性;

  • 有損

JPEG 是一種有損的格式,使用者可以設置自定義品質級別,這個級別決定了有多少圖像資訊會被丟棄。品質級別的值從 0 到 100,但是就算設置為 100,也同樣會有一定程度的品質損耗

當要對某個圖像進行多項編輯操作時,最好使用無損圖像格式來保存中間結果,然後在完成所有的修改後另存為 JPEG 格式,否則將會在每次保存時都損耗一些品質

但也有少數操作是無損的,比如:

-  旋轉(只有在旋轉 90 度、180 度和 270 度的情況下)

-  裁剪

-  翻轉(水平或者垂直)

-  從標準模式切換到漸進模式,反之亦然

-  編輯圖像的元數據
  • 透明和動畫

JPEG 不支援透明或動畫

  • 交錯掃描

除了默認的標準 JPEG(Baseline JPEG),還有一種漸進 JPEG(Progressive JPEG),支援交錯掃描。Internet Explorer 不會逐步地渲染漸進 JPEG 圖像,而是在圖像完全下載時立即全部顯示出來

JPEG 是 web 上用來存儲照片的最佳格式,也被廣泛應用在數碼相機中,然而,這種格式不適合用來存儲圖形,因為有損的壓縮方法將線條和清晰的顏色過渡都變成了「大色塊」

###PNG

為了彌補 GIF 格式的缺點並規避 LZW 演算法的專利問題,PNG(Portable Network Graphics,可攜式網路圖片)應運而生。實際上,人們常開玩笑說 PNG 代表「PNG is Not Gif」的遞迴縮寫,有以下特性:

  • 真彩色和調色盤 PNG 格式

PNG 格式有幾種子類型,但它們大致可以分為兩種:調色盤 PNG 格式和真彩色 PNG 格式。可以使用調色盤 PNG 格式來代替 GIF 格式,使用真彩色 PNG 格式來代替 JPEG 格式

  • 透明

PNG 支援完全的 alpha 透明,在 Internet Explorer 6 中使用這種特性會出現問題(透明區域變成粉藍色,鋸齒等等,更多相關問題請查看 IE6 下 png 背景不透明問題的綜合拓展

  • 動畫

雖然已經有相關實驗和實際應用存在,但截至目前,針對動畫 PNG 格式,還沒有跨瀏覽器的解決方案

  • 無損

與 JPEG 不同的是,PNG 是一種無損的圖像格式:多次編輯不會降低其品質。這使得用真彩色 PNG 來保存 JPEG 的修改過程的中間產物非常合適

  • 逐行掃描

和 GIF 格式一樣,相對於那些垂直方向有重複顏色的圖像來說,PNG 格式對那些水平方向有重複顏色的圖像壓縮比更高

  • 交錯掃描

PNG 支援交錯掃描,並使用了比 GIF 更好的演算法,它允許對真實圖像進行更好的「預覽」,但是支援交錯掃描的 PNG 圖像在文件大小上會更大一些

##三.PNG

###PNG 的分類

PNG 分為 PNG8、PNG24 和 PNG32:

  • PNG8

調色盤 PNG

  • PNG24

真彩色 PNG,但不包括 alpha 通道

  • PNG32

真彩色 PNG,包括 alpha 通道

###PNG 和 GIF

除了不支援動畫以外,調色盤 PNG 擁有 GIF 的所有功能。此外,它還支援 alpha 透明,並且通常壓縮比更高,文件大小更小,所以,應該儘可能使用 PNG8 來代替 GIF

有一個例外是顏色數很少的小圖像,這時 GIF 的壓縮率可能會更高一些,但是這種小圖像其實應該被放在 CSS Sprite 中,因為 HTTP 請求的開銷已經大大超過節省的那點頻寬,而且用 PNG 格式保存 Sprite 圖像可以獲得更高的壓縮率

###PNG 和 JPEG

當圖像中的顏色數超過 256 種時,需要使用真彩色圖像格式——真彩色 PNG 或者 JPEG。JPEG 的壓縮比更高,而且一般來說,JPEG 也是照片存儲的實際標準。但由於 JPEG 是有損的,而且在清晰的顏色過渡周圍會有大色塊,因此以下情況使用 PNG 更合適:

  • 當圖像的顏色略超過 256 種時,可以在不損耗任何可見品質的前提下,將圖像轉換為 PNG8 格式。令人驚奇的是,有時候就算你剝離了 1000 種以上的顏色,都不會注意到圖像中所發生的變化

  • 當大色塊變得不可接受時,比如說包含很多顏色的圖像或軟體選單的截圖,這時候 PNG 就是更好的選擇

##四.優化 CSS Sprite

有一些優化原則,能夠讓 Sprite 變得更小:

  • 按照顏色合併

比如將顏色調色盤相近的圖示組合在一起

  • 避免不必要的空白

讓圖像在行動裝置上更容易處理

  • 將元素水平排列

而不是垂直的,這樣 Sprite 會稍微變小

  • 將顏色限制在 256 種以內

這是 PNG8 格式的顏色數量上限

  • 先優化單獨的圖像,再優化 Sprite

在調色盤色值有限的情況下,可以更容易減少顏色數

  • 透過控制大小和對齊減少反鋸齒像素的數量

如果一個圖示稍微接近正方形,通常可以透過在水平方向或垂直方向對齊來減少反鋸齒像素的數量

  • 避免使用對角線漸變

這種漸變無法被平鋪

  • 避免在 IE6 中使用 alpha 透明圖像

將需要真彩色 alpha 透明的圖像保存在單獨的 Sprite 中

  • 每 2~3 個像素改變漸變的顏色

而不是每個像素都改變

  • 處理 logo 時候要小心

logo 很容易識別,就算非常小的修改也會很容易被注意到

##五.總結

按照上面的解釋,一般情況下 PNG 似乎是最好的選擇,動畫用 GIF,高解析度圖片用 JPEG

其實 WebP 格式也已經出現很久(2010 年)了,目前相容性還不是特別好,但有相應的解決方案,更多資訊請查看 WebP 探尋之路

###參考資料

  • 《高效能網站建設進階指南》

評論

暫無評論,快來發表你的看法吧

提交評論