DDB和DIB 是什么?区别?
BMP圖像文件是Windows ?
?3.X ?
?所采用的圖像文件格式,幾乎所有Wind
ows ?
?上的應(yīng)用軟件都支持這種圖像文件,其中最常見(jiàn)的就是Windows本身所附的繪圖軟件(Paint-Brush),所以欲在Windows上探討圖像的文件格式,勢(shì)必要對(duì)BMP有一個(gè)完整而全面的認(rèn)識(shí)。 ?
?
?BMP圖像分為兩類,DDB和DIB,DDB(device-dependent ?
?bitmap)即為設(shè)備相關(guān)位圖,DIB(device-independent ?
?bitmap)即為設(shè)備無(wú)關(guān)位圖。 ?
?
?DDB中不包括顏色信息,顯示時(shí)是系統(tǒng)的調(diào)色板為基礎(chǔ)進(jìn)行各位的顏色映射的,Windows只能保證系統(tǒng)調(diào)色板的前20種顏色穩(wěn)定不變,所以DDB只能保證正確顯示色彩少于20色的位圖,這便是局限性。所以現(xiàn)在研究的基本上都是基于DIB的圖像文件。 ?
?
?DIB(設(shè)備無(wú)關(guān)位圖)可以在不同的機(jī)器或系統(tǒng)中顯示位圖所固有的顏色。與DDB相比而言,DIB是一種外部的位圖格式,經(jīng)常存儲(chǔ)以BMP為后綴的位圖文件。DIB位圖還支持圖像數(shù)據(jù)的壓縮。BMP文件由文件頭、位圖信息頭、顏色信息和圖像數(shù)據(jù)四部分組成。位圖結(jié)構(gòu)如圖3-1所示: ?
?
??
?
?位圖文件頭結(jié)構(gòu)BITMAPFILEHEADER ?
?
?位圖信息頭結(jié)構(gòu)BITMAPINFOHEADER ?
?
?位圖調(diào)色板RGBQUAD ?
?
?位圖像素?cái)?shù)據(jù) ?
?
?圖3-1 ?
??
?DIB位圖結(jié)構(gòu) ?
?
?1. BMP文件頭: ?
?
?BMP文件頭數(shù)據(jù)結(jié)構(gòu)含有BMP文件的類型、文件大小和位圖起始位置等信息。其結(jié)構(gòu)定義如下: ?
?
?typedef ?
?struct ?
?tagBITMAPFILEHEADER ?
?
?{ ?
?
??
??
?WORD ?
??
?bfType; ?
?
??
??
?WORD ?
??
?bfSize; ?
?
??
??
?WORD ?
??
?bfReserved1; ?
?
??
??
?WORD ?
??
?bfReserved2; ?
?
??
??
?WORD ?
??
?bfOffBits; ?
?
?}BITMAPFILEHEADER,FAR*LPBITMAPFILEHEADER,*PBITMAPFILEHEADER; ?
?
?該結(jié)構(gòu)的長(zhǎng)度是固定的,為14個(gè)字節(jié),各個(gè)域的說(shuō)明如下: ?
?
? bfType:指定文件類型,必須是0x4d42,即字符串“BM”。 ?
?
? bfSize:指定文件大小,包括這14個(gè)字節(jié)。 ?
?
? bfReserved1,bfReserved2:保留字,為0。 ?
?
? bfOffBits:從文件頭到實(shí)際的位圖數(shù)據(jù)的偏移字節(jié)數(shù),即圖1中前三個(gè)部分的長(zhǎng)度之和。 ?
?
??
?
?2. ?
?位圖信息頭: ?
?
?BMP位圖信息頭數(shù)據(jù)用于說(shuō)明位圖的尺寸等信息。 ?
?
?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,FAR*LPBITMAPINFOHEADER,*PBITMAPINFOHEADER; ?
?
?該結(jié)構(gòu)的長(zhǎng)度也是固定的,為40個(gè)字節(jié),各個(gè)域的說(shuō)明如下: ?
?
? biSize:指定這個(gè)結(jié)構(gòu)的長(zhǎng)度,為40個(gè)字節(jié)。 ?
?
? biWidth:指定圖像的寬度,單位是象素。 ?
?
? biHeight:指定圖像的高度,單位是象素。 ?
?
? biPlanes:必須是1。 ?
?
? biBitCount:指定表示顏色時(shí)用到的位數(shù),常用的值為1(黑白二色圖)、4(16色圖)、8(256色圖)、24(真彩色圖)。 ?
?
? biCompression:指定位圖是否壓縮,有效值為BI_RGB,BI_RLE8,BI_RLE4,BI_BITFIELDS。Windows位圖可采用RLE4和RLE8的壓縮格式,BI_RGB表示不壓縮。 ?
?
? biSizeImage:指定實(shí)際的位圖數(shù)據(jù)占用的字節(jié)數(shù),可用以下的公式計(jì)算出來(lái): ?
?
??
??
??
??
??
??
??
??
??
??
??
??
??
?biSizeImage ?
?= ?
?biWidth’× ?
?biHeight ?
?
??
??
??
??
?要注意的是:上述公式中的biWidth’必須是4的整數(shù)倍(不是biWidth,而是大于或等于biWidth的離4最近的整數(shù)倍)。如果biCompression為BI_RGB,則該項(xiàng)可能為0。 ?
?
? biXPelsPerMeter:指定目標(biāo)設(shè)備的水平分辨率。 ?
?
? biYPelsPerMeter:指定目標(biāo)設(shè)備的垂直分辨率。 ?
?
? biClrUsed:指定本圖像實(shí)際用到的顏色數(shù),如果該值為0,則用到的顏色數(shù)為2的biBitCount次冪。 ?
?
? biClrImportant:指定本圖像中重要的顏色數(shù),如果該值為0,則認(rèn)為所有的顏色數(shù)都是重要的。 ?
?
?3. ?
?圖調(diào)色板(RGBQUAD): ?
?
?第三部分為調(diào)色板。有些位圖需要調(diào)色板,有些位圖,如真彩色圖,不需要調(diào)色板,它們的BITMAPINFOHEADER后面直接是位圖數(shù)據(jù)。 ?
?
?調(diào)色板實(shí)際上是一個(gè)數(shù)組,共有biClrUsed個(gè)元素(如果該值為0,則有2的biBitCount次冪個(gè)元素)。數(shù)組中每個(gè)元素的類型是一個(gè)RGBQUAD結(jié)構(gòu),占4個(gè)字節(jié),其數(shù)據(jù)結(jié)構(gòu)定義如下: ?
?
?typedef ?
?struct ?
?tagRGBQUAD ?
?
?{ ?
?
??
??
??
??
??
??
??
??
??
?BYTE ?
??
??
?rgbBlue; ?
?
??
??
??
??
??
??
??
??
??
?BYTE ?
??
??
?rgbGreen; ?
?
??
??
??
??
??
??
??
??
??
?BYTE ?
??
??
?rgbRed; ?
?
??
??
??
??
??
??
??
??
??
?BYTE ?
??
??
?rgbReserved; ?
?
?}RGBQUAD; ?
?
?其中: ?
?
? rgbBlue:該顏色的藍(lán)色分量。 ?
?
? rgbGreen:該顏色的綠色分量。 ?
?
? rgbRed:該顏色的紅色分量。 ?
?
? rgbReserved:保留值。 ?
?
?4. ?
?圖像數(shù)據(jù): ?
?
?對(duì)于用到調(diào)色板的位圖,圖像數(shù)據(jù)就是該象素顏色在調(diào)色板中的索引值,對(duì)于真彩色圖,圖像數(shù)據(jù)就是實(shí)際的R、G、B值。 ?
?
? 對(duì)于2色圖,用1位就可以表示該象素的顏色,所以1個(gè)字節(jié)可以表示8個(gè)象素。 ?
?
? 對(duì)于16色圖,用4位可以表示一個(gè)象素的顏色,所以1個(gè)字節(jié)可以表示2個(gè)象素。 ?
?
? 對(duì)于256色圖,1個(gè)字節(jié)剛好可以表示1個(gè)象素。 ?
?
? 對(duì)于真彩色圖,3個(gè)字節(jié)才能表示1個(gè)象素。 ?
?
?BMP圖像數(shù)據(jù)的存儲(chǔ)順序是由下往上、由左向右(即圖像上下顛倒存儲(chǔ)),而圖像的寬度(以字節(jié)為單位)必須是4的倍數(shù),倘若不到4的倍數(shù)則必須補(bǔ)足,并且圖像的數(shù)據(jù)及其調(diào)色板數(shù)據(jù)存儲(chǔ)格式為BGRBGR…而不是一般習(xí)慣的RGBRGB…。?
?
?
?
1。DIB是設(shè)備無(wú)關(guān)位圖,DDB是設(shè)備相關(guān)位圖,創(chuàng)建位圖句柄時(shí)DDB需要傳門創(chuàng)建調(diào)色板句柄而DIB就不需要。??
??2。lpvoid都是數(shù)據(jù)緩沖區(qū),GetDIBits()就是預(yù)留存儲(chǔ)圖像數(shù)據(jù)的區(qū)域,而CreateDIBSection()就是需轉(zhuǎn)換為句餅的圖像數(shù)據(jù)的區(qū)域。??
??3。創(chuàng)建一個(gè)DC,將某一DIB句柄與它關(guān)聯(lián),將屏幕DC拷貝到該創(chuàng)建DC上。
==================================================================================
1/???DIB一般用于位圖文件(*.BMP),而DDB一般在程序運(yùn)行中使用??
??2/???SetDIBits()它是將DIB位圖轉(zhuǎn)換為DDB位圖。比如說(shuō)你想顯示一個(gè)BMP位圖文件,你就??
??可以先從文件頭結(jié)構(gòu)中讀出位圖的大小,然后按照這個(gè)尺寸創(chuàng)建一個(gè)空位圖句柄,再分配??
??一塊內(nèi)存,將位圖文件中的位數(shù)據(jù)讀到這塊內(nèi)存中。(注意,這個(gè)位數(shù)據(jù)就是DIB格式的)??
??然后再調(diào)用SetDIBits()函數(shù),空位圖句柄對(duì)應(yīng)HBITMAP參數(shù),內(nèi)存地址對(duì)應(yīng)LPVOID參??
??數(shù)。成功返回之后,空位圖句柄中位圖的圖像就和文件中的一樣了。你可以拿這個(gè)句柄??
??代入象BitBlt()之類的函數(shù)中進(jìn)行各種操作。這個(gè)句柄就是DDB位圖句柄。此時(shí),調(diào)用前分配的內(nèi)存塊已經(jīng)沒(méi)用了,可以釋放。??
??????GetDIBits()函數(shù)的功能與SetDIBits()相反,它是將你從屏幕或其它途徑獲取的DDB??
??位圖轉(zhuǎn)換為DIB位圖。轉(zhuǎn)換后的DIB位數(shù)據(jù)將保存在LPVOID所指向的內(nèi)存中。如果你再填寫??
??一個(gè)正確的BITMAPINFO結(jié)構(gòu),那么建立位圖文件就很容易了。?
總結(jié)
以上是生活随笔為你收集整理的DDB和DIB 是什么?区别?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: [转]区块链主流开源技术体系介绍
- 下一篇: 蔚来汽车第 2100 座换电站于 G22