天天看點

關于位圖中【調色闆】、DDB、DIB的概念

一、調色闆

1.我們知道,自然界中的所有顔色都可以由紅、綠、藍(R,G,B)三基色組合而成。而計算機對于像素的處理,用一個位元組,将每種基色分為了256種等級,那麼紅、綠、藍的不同組合共有256*256*256=16777216種,如此之多的組合,對于人眼的辨識能力來說,已經相當足夠了,這就是我們平時所說的"真彩色".

對每個像素進行了(R,G,B)量化的圖像就是位圖,其在計算機中對應檔案的擴充名一般為.bmp.

然而,對于"真彩色"來說,它的顔色種類實際上已經超出了人眼的識别範圍,在很多時候,我們并沒有必要将顔色劃分得如此之細.而"真彩色"圖檔存儲空間過大,也是這種檔案的一種弊端.我們可以來計算一下一個800*600的"真彩色"圖檔所需要的存儲空間的大小:

800*600*3 = 1440000(位元組)= 1.37M(位元組)

這是不是和你們平時看到的WINDOWS桌面一樣大小(當然,這裡除去了位圖檔案中檔案頭以及其他資訊頭的大小,這些将在後面講到).如果每個圖形檔案都花費掉如此大的空間,是很不劃算的,于是就出現了"調色闆",它的功能在于緩解位圖檔案存儲空間過大的問題.位圖檔案也就出現了單色,16色,256色,16位,24位真彩色幾種格式.

對于一個16色位圖檔案,它每個象素,隻需要4bit,因為調色闆提供了這16種等級對應的(R,G,B)值,我們隻需要4bit來存儲象素在調色闆中的索引值,這樣,一個800*600的16色位圖檔案所需要的存儲空間為:

800*600*4/8 = 240000(位元組) = 0.22 M(位元組)

而調色闆所帶來的額外開銷僅僅為16*4=64位元組.存儲空間大為減少了!

對于單色,16色,256色3種位圖檔案,都是以調色闆方式進行存儲;而對16位及24位真彩色以調色闆進行存儲是不劃算的,它們直接按照R,G,B分量進行存儲。

2.位圖中的調色闆子產品

調色闆(色數*4位元組)

16)28-...:調色闆規範.對于調色闆中的每個元素,用下述方法來描述RGB的值:

   1位元組用于藍色分量 

   1位元組用于綠色分量 

   1位元組用于紅色分量 

   1位元組為保留字

   調色闆針對的是需要調色闆的位圖,即單色,16色和256色等.對于不以調色闆方式存儲的位圖,則沒有此資訊.它實際上就是一個數組,用來儲存上面所提到的RGB元素,其中元素的個數由14)裡提到的顔色索引數來定,當該值為0的時候,則根據色數來定,其大小等于2的n次幂,n是9)中提到的每個像素的位數(實際上,數組大小通常也就是2,16,256...).

3.後面是實際的位圖資料ImageDate.

對于用到調色闆的位圖,實際的圖象資料ImageDate為該象素的顔色在調色闆中的索引值;對于真彩色圖,圖象資料則為實際的R、G、B值:

  a.單色位圖:用1bit就可以表示象素的顔色索引值;

  b.16色位圖:用4bit可以表示象素的顔色索引值;

  c.256色位圖:1個位元組表示1個象素的顔色索引值;

  d.真彩色:3個位元組表示1個象素的顔色R,G,B值.

  此外,位圖資料每一行的位元組數必須為4的整倍數,如果不是,則需要補齊.位圖檔案中的資料是從下到上(而不是從上到下),從左到右方式存儲的.

二、DDB和DIB

在此基礎上,讓我們再來看2個概念:DDB位圖(Device-dependent bitmap,與裝置相關的位圖)與DIB位圖(Device-independent bitmap,與裝置無關的位圖)

DDB依賴于具體裝置,它隻能存在于記憶體中(視訊記憶體或系統記憶體),其顔色模式必須與特定的輸出裝置相一緻,使用系統調色闆.是以一般隻能載入色彩較簡單的DDB位圖,而對于顔色較豐富的位圖,則需使用DIB才能長期儲存.

DIB不依賴于具體裝置,可以用來永久性地儲存圖象.DIB一般是以*.BMP檔案的形式儲存在磁盤中的,有時也會儲存在*.DIB檔案中. DIB位圖的特點是将顔色資訊儲存在位圖檔案自身的顔色表中,應用程式要根據此顔色表為DIB建立邏輯調色闆.是以,在輸出一幅DIB位圖之前,程式應該将其邏輯調色闆選入到相關的裝置上下文并實作到系統調色闆中.