DIB(裝置無關位元影像)編程系列(一)——基本知識和檔案結構

來源:互聯網
上載者:User

         先介紹有關位元影像的相關知識,然後在接下來的幾篇文章中,介紹怎麼編程來處理位元影像……

一:彩色圖的概念

彩色圖是怎麼回事呢?我們先來說說三元色RGB概念。

       我們知道,自然界中的所有顏色都可以由紅、綠、藍(R,G,B)組合而成。有的顏色含有紅色成分多一些,如深紅;有的含有紅色成分少一些,如淺紅。針對含有紅色成分的多少,可以分成0到255共256個等級,0級表示不含紅色成分;255級表示含有100%的紅色成分。同樣,綠色和藍色也被分成256級。這種分級概念稱為量化。

這樣,根據紅、綠、藍各種不同的組合我們就能表示出256×256×256,約1600萬種顏色。這麼多顏色對於我們人眼來說已經足夠豐富了。

       你大概已經明白了,當一幅圖中每個象素賦予不同的RGB值時,能呈現出五彩繽紛的顏色了,這樣就形成了彩色圖。的確是這樣的,但實際上的做法還有些差別。讓我們來看看下面的例子。

       有一個長寬各為200個象素,顏色數為16色的彩色圖,每一個象素都用R、G、B三個分量表示。因為每個分量有256個層級,要用8位(bit),即一個位元組(byte)來表示,所以每個象素需要用3個位元組。整個映像要用200×200×3,約120k位元組,可不是一個小數目呀!如果我們用下面的方法,就能省的多。

       因為是一個16色圖,也就是說這幅圖中最多隻有16種顏色,我們可以用一個表:表中的每一行記錄一種顏色的R、G、B值。這樣當我們表示一個象素的顏色時,只需要指出該顏色是在第幾行,即該顏色在表中的索引值。舉個例子,如果表的第0行為(255,0,0) (紅色),那麼當某個像素為紅色時,只需要標明0即可。

讓我們再來計算一下:16種狀態可以用4位(bit)表示,所以一個象素要用半個位元組。整個映像要用200×200×0.5,約20k位元組,再加上表佔用的位元組為3×16=48位元組,整個佔用的位元組數約為前面的1/6,省很多吧?

        這張R、G、B的表,就是我們常說的調色盤(Palette),另一種叫法是顏色尋找表LUT(LookUp Table),似乎更確切一些。Windows位元影像中便用到了調色盤技術。其實不光是Windows位元影像,許多影像檔格式如pcx、tif、gif等都用到了。所以很好地掌握調色盤的概念是十分有用的。

        有一種圖,它的顏色數高達256×256×256種,也就是說包含我們上述提到的R、G、B顏色表示方法中所有的顏色,這種圖叫做真彩色圖(true color)。真彩色圖並不是說一幅圖包含了所有的顏色,而是說它具有顯示所有顏色的能力,即最多可以包含所有的顏色。表示真彩色圖時,每個象素直接用R、G、B三個分量位元組表示,而不採用調色盤技術。原因很明顯:如果用調色盤,表示一個象素也要用24位,這是因為每種顏色的索引要用24位(因為總共有224種顏色,即調色盤有224行),和直接用R,G,B三個分量表示用的位元組數一樣,不但沒有任何便宜,還要加上一個256×256×256×3個位元組的大調色盤。所以真彩色圖直接用R、G、B三個分量表示,它又叫做24位色圖。

二、DIB簡介

       DIB:即Device-independent bitmap 裝置無關位元影像檔案。裝置無關簡單的說就是:DIB的顏色模式與裝置無關。例如,一個256色的DIB即可以在真彩色顯示模式下使用,也可以在16色模式下使用。256色以下(包括256色)的DIB擁有自己的顏色表(為什麼真彩圖沒有調色盤的原因已經在上面說過了),像素的顏色獨立於系統調色盤。由於DIB不依賴於具體裝置,因此可以用來永久性地儲存映像。

       DIB一般是以*.BMP檔案的形式儲存在磁碟中的,有時也會儲存在*.DIB檔案中。

三、bmp檔案資料結構

介紹完了關於彩色圖和DIB的相關知識後,介紹有關bmp格式檔案的在儲存時的相關資料結構。

bmp檔案結構分四部分如:

 

 3.1:位元影像檔案頭資訊

typedef struct tagBITMAPFILEHEADER {

 WORD    bfType;

 DWORD   bfSize;

 WORD    bfReserved1;

 WORD    bfReserved2;

 DWORD   bfOffBits;

} BITMAPFILEHEADER, *PBITMAPFILEHEADER;


這個資料結構的長度是固定的,為14個位元組(WORD為無符號16位整型,DWORD為無符號32位整型,所以(16*3+32*2)/8=14位元組  )。


參數含義(摘自MSDN):

bfType

Specifies the file type, must be BM.(指定檔案類型,必須是0x4d42,即字串”BM”。)

bfSize

Specifies the size, in bytes, of the bitmapfile. (指定檔案大小,包括這14個字元)

bfReserved1

Reserved; must be zero. (保留字)

bfReserved2

Reserved; must be zero. (保留字)

bfOffBits

Specifies the offset, in bytes, from thebeginning of the BITMAPFILEHEADER structure to the bitmap bits.(為從檔案頭到實際的位元影像資料的位移位元組數,即位元影像檔案頭+位元影像資訊頭+調色盤)

 

3.2、位元影像資訊頭

typedef struct tagBITMAPINFOHEADER{

 DWORD  biSize;

  LONG   biWidth;

 LONG   biHeight;

 WORD   biPlanes;

 WORD   biBitCount;

 DWORD  biCompression;

 DWORD  biSizeImage;

 LONG   biXPelsPerMeter;

 LONG   biYPelsPerMeter;

 DWORD  biClrUsed;

 DWORD  biClrImportant;

} BITMAPINFOHEADER, *PBITMAPINFOHEADER;

 

這個結構體的長度也是固定的,為40個位元組(LONG為32位整型)。

參數說明(簡單說明,具體參看MSDN):

 

biSize

指定這個結構的長度,為40。

biWidth

指定映像的寬度,單位是像素。

biHeigth

指定映像的高度,單位是像素。

biPlanes

必須是1.

biBitCount

指定表示顏色時要用到的位元,常用的值為1、4、8、24。

biCompression

指定位元影像是否壓縮,有效值為一些windows定義好的常量。

biSizeImage

指定實際的位元影像資料佔用的位元組數(也就是bmp檔案結構圖第四部分的位元組數)。

可以從公式 biSizeImage = biWidth * biHeight(biWidth必須是4的整數倍)算出。

該項可能為0。

biXPelsPerMeter

指定目標裝置的水平解析度,單位是每米的像素個數

biYPelsPerMeter

指定目標裝置的垂直解析度,單位是每米的像素個數

biClrUsed

指定本映像實際用到的顏色數,如果為0,則用到得顏色數為2biBitCount

biClrImportant

指定重要顏色數,如果為0,則所有顏色都重要。

 

3.3、調色盤

是一個數組,共有biClrUsed個元素(如果biClrUsed為0,則有2biBitCount個)

數組中的每個元素的類型是一個RGBQUAD結構體,佔4個位元組,定義如下:

typedef struct tagRGBQUAD {

 BYTE    rgbBlue;   //該顏色的藍分量

 BYTE    rgbGreen;  //該顏色的綠分量

 BYTE    rgbRed;   //該顏色的紅分量

 BYTE    rgbReserved;

} RGBQUAD;

一定注意不是紅綠藍而是綠藍紅。

 

3.4、下來就是實際的映像資料了。

注意兩點:

一:每一行的位元組數必須是4的倍數,如果不是,則需要補全。

二:一般來說,bmp檔案資料是從下到上,從左至右。也就是檔案中先讀到的是映像最下面一行最左邊的第一個像素,最後得到是最上面一行最右邊的像素。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.