純無趣技術貼,關於色深、位深、圖像深度詳解

由於近期接觸了一點嵌入式開發,須要的圖片資源格式和以往接觸的移動及web開發差異比較大,纔有了下面這篇文章。由於比較晦澀,不須要的就能夠繞行了。web

圖像深度、色深、位深的大統一

首先明確一點,圖像深度就是色深Color Depth。關於色深和位深Bit-depth,查了不少資料,衆說紛紜,有說色深是存儲每一個像素所用的bit數,而位深是描述通道的屬性,那咱們一般所說的24位真彩和16位全綵顏色模式,這裏的24和16是位深仍是色深呢?其實大可沒必要糾結,能夠統稱爲深度。在顯示器的參數中,使用更多的是位深Bit-depth的概念。後面會詳細說明深度和具體顏色的關係。編輯器

雖然在設計師眼裏,PNG、BMP、JPG、JPEG、GIF這些有分辨率屬性的點陣圖像通通稱之爲位圖,來對應可任意縮放的矢量圖,好比SVG,但在工程師,尤爲是硬件工程師眼裏,位圖可能專指BMP格式,因此,必定要和開發人員提早確認,尤爲是當涉及到嵌入式開發時,更是如此,越底層越麻煩越受限。編碼

計算機存儲圖像的原理

由於對於設計師最經常使用的PS軟件在保存BMP格式時有深度的選項,因此下面都以BMP格式爲例來講明,尤爲是PNG和JPEG都是通過壓縮的,具體壓縮原理不明,也不做解釋。追本溯源,做爲只能識別二進制語言的計算機,在進行圖像存儲時存的是什麼呢?像素點。一個8px*8px的圖片,一共有64個像素點,計算機在存儲時,會針對這64個點依次進行存儲。當一個圖片保存成hex格式(這是燒入單片機須要的格式),用文本編輯器打開,會發現所有由16進制的編碼串組成,這裏的每一串編碼就是一個像素點,64個編碼串解析後呈現出不一樣的顏色,最終組成了圖片。設計

位深值分配給通道

在BMP格式進行存儲的時候,如圖所示,系統會有一個關於深度的提示,當咱們由基本模式切換到高級模式後,看到16位、24位和32位的具體選項,(X或A)nRnGnBn或RnGnBn的形式表示,(n表示分配給該通道的位數值)。由於每一個通道只支持256(0-255)個值,所以,通道擁有的位數值不會大於8(256是2的8次冪)。3d

舉一個16位的說明,R5G6B5,並非色值的表示方法RGB(5,6,5),而是這16位的位深的通道分配方法,R值支持2的5次冪(32)個值,G值支持2的6次冪(64)個值,B值支持2的5次冪(32)個值,若是16位分配給R8G8B0,但在最終顏色的組成上,65536種顏色會缺乏藍色的元素,只有紅和綠的65536種組合。固然,這是極不合理的,只有RGB的組合才能造成彩色,因此位數要平均分配給R,G,B和透明通道Alpha四個通道。 這些通道的設置基本上就是經常使用設置。cdn

對於Android開發人員,可能不陌生,Bitmap ConfigARGB_8888,對應這裏24位的X8R8G8B8,ARGB_4444對應16位的X4R4G4B4,RGB_565對應16位深的R5G6B5,沒有透明度。blog

所以,位深是8位的圖,最多隻有2的8次冪,也就是256種顏色,遠達不到咱們對圖片的色彩的須要,對於嵌入式系統或者工控領域,顯示器纔會是16位如下。而當位深達到16位時,支持的顏色就有2的16次冪,65536種顏色,也就是咱們說的高彩。而GIF格式的圖片,就僅能支持256種顏色,這也是爲何轉成GIF有時會失真的緣由。其中,32位和24位在RGB通道上是相同的,但8位用來保存Alpha通道。換句話說,在彩色的表現上並沒有差異,但增長了8位,即2的8次冪(256)階色的灰度,只是顏色的過渡上更加天然,已經到了人眼沒法識別差異的程度。圖片

在PS保存成BMP格式種,提供了1位、4位、8位、16位、24位和32位的選項,這只是經常使用位深,6位可不能夠?固然是能夠的,對於6位的圖像,能夠分配到不一樣的通道R2G2B2,一共支持4*4*4 共計64種不一樣的顏色。即便是100*100 一共一萬個像素點的圖片,對於6位位深而言,也只有64種顏色能夠選擇。好比咱們項目中,顯示芯片的規格書中明確規定了支持6-bit,R支持的四個值對應0,1/3R,2/3R和1R,G支持的四個值對應0,1/3G ,2/3G和1G,B支持的四個值對應0,1/3B ,2/3B和1B。怎麼轉換成設計師能看懂的語言呢,以紅色R爲例,RGB顏色的表示方法中能夠在0-255範圍內進行設置,限定的四個值就依次變成了(0,75,150,255),這樣看就明確了不少,在進行色彩選擇時RGB(75,150,75)這種顏色,或者RGB(0,75,150)等等,只要保證是這四個值的組合就能夠了。最簡單當方法就是下載一個64位色的色板。資源

位深與圖片尺寸的正相關

說完了位深的分配,再來看存儲,也就是對圖片尺寸的影響。開發

bit比特和Byte字節

bit是計算機最基本的存儲單元,是二進制的「0」或者「1」,而Byte一般做爲存儲單位。Byte和bit存在換算關係,1Byte=8bit。

一個8位深的圖片,儲存每一個像素所須要的位數是多少?根據位深的含義,每一個像素點可存放8位二進制,每一個二進制是一個bit,所以,一個像素須要8bit,也就是1Byte。而16位顏色的圖,存儲每一個像素點,存放的是16位二進制,存儲一個像素則須要2Byte。固然了,由於計算機在存儲圖片時還要存儲像素以外的如位圖頭、位圖信息、調色板等其餘信息(就像txt文檔的尺寸並不只僅是裏面文本所佔據的字節的數量),所以並不和咱們的換算結果徹底相同,只要瞭解不一樣位深致使的圖片尺寸變化的緣由就好。對於BMP格式的圖片,不受顏色的約束的,每一個色素點,純黑純白灰度或者彩色的,存儲所佔用的字節數是相同的,影響大小的只有位深。下面這張圖,全部圖片的分辨率都是8*8像素,我用不一樣後綴的明明白白來區分導出時選擇的位深。顯而易見的是,只要是16位深,不管灰色、純紅、任意RGB顏色、甚至是漸變,在存儲時都是相同的尺寸。而相同分辨率的相同的灰色填充的圖片,在保存成24位深和32位深時,相對於16位,尺寸就呈現一個階梯增長的趨勢。

而PNG這種壓縮格式,則受制於色彩的豐富度。下面這張圖片的對比能很好的說明問題,一樣是256px*256px的圖片,一個色彩豐富,一個只有兩種顏色,在一樣選擇PNG-24時,尺寸差別很大,但BMP一樣是16位位深,則是相同的尺寸。

總結

深度瞭解圖片位深對色彩影響的機制,主要就是在面對具體的項目時,能夠更加靈活的選擇更合適的圖片格式,以及在色彩的選取上,如何才能適應不一樣的顯示芯片。把硬件規格說明書中晦澀難懂的部分轉換成設計時須要參考的資源。

相關文章
相關標籤/搜索