常见图片格式了解
前言
作為一個客戶端開發,對于圖片格式一直沒有一個清晰的了解,這里簡單的羅列出各種圖片格式的區別,文章中有部分是他人的引用,會在底部放上鏈接,望輕噴。
概念了解
有損壓縮 & 無損壓縮
有損壓縮(lossy compression):
有損壓縮算法是一種數據壓縮方法,經過此方法壓縮、解壓的數據會
與原始數據不同但是非常接近。它是與無損數據壓縮相對的壓縮方法。有損數據壓縮又稱破壞性資料壓縮、有損壓縮、有損壓縮、不可逆壓縮。其原理是借由將次要的信息數據舍棄,犧牲一些質量來減少數據量、提高壓縮比。這種方法經常用于壓縮多媒體數據(音頻、視頻、圖片)。根據各種格式設計的不同,有損數據壓縮都會有代間損失——每次壓縮與解壓文件都會帶來漸進的質量下降。
無損壓縮(Lossless Compression):
指數據經過壓縮后,信息不受損失,還能完全恢復到壓縮前的原樣。無損壓縮通常用于嚴格要求“經過壓縮、解壓縮的數據必須與原始數據一致”的場合。典型的例子包括文字文件、程序可執行文件、程序源代碼。有些圖片文件格式,例如PNG和GIF,使用的是無損壓縮。
索引色 & 直接色
索引色:
索引顏色是一種以有限的方式管理數字圖像顏色的技術,以節省計算機內存和文件存儲,同時加速顯示刷新和文件傳輸。即
用一個數字來代表(索引)一種顏色,在存儲圖片的時候,存儲一個數字的組合,同時存儲數字到圖片顏色的映射。這種方式只能存儲有限種顏色,通常是256種顏色,對應到計算機系統中,使用一個字節的數字來索引一種顏色。
索引色常見有1位(即黑白),8位(即灰階/256色),16位(即高彩),24位(即真彩),30/36/48位(即全彩),更多詳細參考該百科。
直接色:
使用四個數字來代表一種顏色,這四個數字分別代表這個顏色中紅色、綠色、藍色以及透明度(即rgba)。現在流行的顯示設備可以在這四個維度分別支持256種變化,所以直接色可以表示2的32次方種顏色。當然并非所有的直接色都支持這么多種,為壓縮空間使用,有可能只有表達紅、綠、藍的三個數字,每個數字也可能不支持256種變化之多。
位圖 & 矢量圖:
位圖:
位圖[bitmap],也叫做點陣圖,柵格圖像,像素圖,簡單的說,
就是最小單位由像素構成的圖,縮放會失真。構成位圖的最小單位是像素,位圖就是由像素陣列的排列來實現其顯示效果的,每個像素有自己的顏色信息,在對位圖圖像進行編輯操作的時候,可操作的對象是每個像素,我們可以改變圖像的色相、飽和度、明度,從而改變圖像的顯示效果。舉個例子來說,位圖圖像就好比在巨大的沙盤上畫好的畫,當你從遠處看的時候,畫面細膩多彩,但是當你靠的非常近的時候,你就能看到組成畫面的每粒沙子以及每個沙粒單純的不可變化顏色。
矢量圖:
矢量圖[vector],也叫做向量圖,簡單的說,就是
縮放不失真的圖像格式。矢量圖是通過多個對象的組合生成的,對其中的每一個對象的紀錄方式,都是以數學函數來實現的,也就是說,矢量圖實際上并不是象位圖那樣記錄畫面上每一點的信息,而是紀錄了元素形狀及顏色的算法,當你打開一幅矢量圖的時候,軟件對圖形相對應的函數進行運算,將運算結果[圖形的形狀和顏色]顯示給你看。無論顯示畫面是大還是小,畫面上的對象對應的算法是不變的,所以,即使對畫面進行倍數相當大的縮放,其顯示效果仍然相同[不失真]。舉例來說,矢量圖就好比畫在質量非常好的橡膠膜上的圖,不管對橡膠膜怎樣的常寬等比成倍拉伸,畫面依然清晰,不管你離得多么近去看,也不會看到圖形的最小單位。
圖片類型
BMP
BMP取自位圖BitMaP的縮寫,也稱為DIB(與設備無關的位圖),是一種與顯示器無關的位圖數字圖像文件格式。BMP同時
支持索引色和直接色,但是其幾乎沒有壓縮,所以通常圖片非常的大,也導致了其幾乎沒有用武之地,現在除了在Windows操作系統中還比較常見之外,我們幾乎看不到它。再加上瀏覽器的不支持,所以作為web開發,更加少于看到BMP。
這里簡單描述一下BMP解析成二進制時的結構:
| 位置 | 含義 |
|---|---|
| bmp文件頭(bmp file header) | 提供文件的格式、大小等信息 |
| 位圖信息頭(bitmap information) | 提供圖像數據的尺寸、位平面數、壓縮方式、顏色索引等信息 |
| 調色板(color palette)(如果有的話) | 如使用索引來表示圖像,調色板就是索引與其對應的顏色的映射表 |
| 位圖數據(bitmap data) | 則圖片數據 |
GIF
全稱Graphics Interchange Format,采用
LZW壓縮算法進行編碼。是無損的、采用索引色的、點陣圖。GIF是無損的,采用GIF格式保存圖片不會降低圖片質量。但得益于數據的壓縮,GIF格式的圖片,其文件大小要遠小于BMP格式的圖片。文件小,是GIF格式的優點,同時,GIF格式還具有支持動畫以及透明的優點。但,GIF格式僅支持8bit的索引色,即在整個圖片中,只能存在256種不同的顏色。
簡單介紹下GIF使用的LZW壓縮算法,詳細可參考該文章:
LZW編碼 (Encoding) 的核心思想其實比較簡單,就是把出現過的字符串映射到記號上,這樣就可能用較短的編碼來表示長的字符串,實現壓縮。 比如: 我們可以將ABCDEFG 轉成 1 來代表, 這樣數據就會減少很多。再加上,LZW編碼是自解釋 (self-explaining) 的,即映射字典不會寫到壓縮數據里,他是在解碼的過程中還原出編碼時用的字典。
JPEG
JPEG是
有損的、采用直接色的、點陣圖。JPEG也是一種針對照片影像而廣泛使用的有損壓縮標準方法。JPEG圖片格式的設計目標,是在不影響人類可分辨的圖片質量的前提下,盡可能的壓縮文件大小。這意味著JPEG去掉了一部分圖片的原始信息,也即是進行了有損壓縮。JPEG的圖片的優點,是采用了直接色,得益于更豐富的色彩,JPEG非常適合用來存儲照片,用來表達更生動的圖像效果,比如顏色漸變。
JPEG的算法比較復雜, 如果有興趣可以參考該文章
其大概分為三步:
- 把數據分為“重要部分”和“不重要部分”
- 濾掉不重要的部分
- 保存
PNG
便攜式網絡圖形(英語:Portable Network Graphics,縮寫:PNG)是一種無損壓縮的位圖圖形格式,支持索引、灰度、RGB三種顏色方案以及Alpha通道等特性。PNG的開發目標是改善并取代GIF作為適合網絡傳輸的格式而不需專利許可,所以被廣泛應用于互聯網及其他方面上。
PNG-8
PNG-8是無損的、使用索引色的、點陣圖。PNG是一種比較新的圖片格式,PNG-8是非常好的GIF格式替代者,在可能的情況下,應該盡可能的使用PNG-8而不是GIF,因為在相同的圖片效果下,PNG-8具有更小的文件體積。除此之外,PNG-8還支持透明度的調節,而GIF并不支持。 現在,除非需要動畫的支持,否則我們沒有理由使用GIF而不是PNG-8。當然了,PNG-8本身也是支持動畫的,只是瀏覽器支持得不好,不像GIF那樣受到廣泛的支持。
PNG-24
PNG-24是PNG的直接色版本。PNG-24是無損的、使用直接色的、點陣圖。無損的、使用直接色的點陣圖,聽起來非常像BMP,是的,從顯示效果上來看,PNG-24跟BMP沒有不同。PNG-24的優點在于,它壓縮了圖片的數據,使得同樣效果的圖片,PNG-24格式的文件大小要比BMP小得多。當然,PNG24的圖片還是要比JPEG、GIF、PNG-8大得多。雖然PNG-24的一個很大的目標,是替換JPEG的使用。但一般而言,PNG-24的文件大小是JPEG的五倍之多,而顯示效果則通常只能獲得一點點提升。所以,只有在你不在乎圖片的文件體積,而想要最好的顯示效果時,才應該使用PNG-24格式。另外,PNG-24跟PNG-8一樣,是支持圖片透明度的。
PNG-32
PNG32也是PNG的直接色版本。其表現與PNG-24差不多。
三者的區別在于:
- PNG-32每個像素的深度為32bits,其中RGBA四個通道各占8bits。所謂的RGBA四個通道,就是紅,綠,藍,透明 這四種色值各自的大小,都用8bits來表示(0~255)。
- PNG-24的像素深度為24bits,其中RGB三個通道各占8bits。
- PNG-8則是使用8位的索引色。
SVG
SVG是很多種矢量圖中的一種,它的特點是使用XML來描述圖片。借助于前幾年XML技術的流行,SVG也流行了很多。使用XML的優點是,任何時候你都可以把它當做一個文本文件來對待,也就是說,你可以非常方便的修改SVG圖片,你所需要的只需要一個文本編輯器。如果你是一個前端開發,那你應該對其了解比較多。
圖片比較與場景應用
| 類型 | 優點 | 缺點 | 應用場景 |
|---|---|---|---|
| BMP | 無損壓縮,圖質最好,支持索引色和直接色 | 文件過大 | 目前僅存于WINDOWS系統 |
| GIF | 無損壓縮,支持動畫及透明 | 僅支持256種顏色,畫質差 | 需要動畫的需求 |
| JPEG | 文件小 | 有損壓縮,畫質損失 | 不考慮過好畫質且需響應速度較快, 如大背景圖 |
| PNG-8 | 無損壓縮, 支持透明 | 畫質中等 | 應用于大多數中小圖且要求畫質比較好的需求 |
| SVG | 支持放大縮小而不影響畫質 | 編寫麻煩,性能差 | 多應用于ICON之類 |
一圖勝前言
待補充
總結
了解各種圖片的格式,有助于我們與設計同事的溝通,與大家共勉。
引用 & 參考
圖片格式那么多,哪種更適合你?
轉載于:https://juejin.im/post/5c8a180f6fb9a049eb3cce9e
總結
- 上一篇: HTPC知识普及第一讲2
- 下一篇: camel.js_Camel 2.11