4. DIB位圖編程
4.1位圖文件格式
先來分析DIB位圖文件的格式,。位圖文件分為四部分:
?。?)位圖文件頭BITMAPFILEHEADER
位圖文件頭BITMAPFILEHEADER是一個結(jié)構(gòu)體,長度為14字節(jié),,定義為:
typedef struct tagBITMAPFILEHEADER { WORD bfType; //文件類型,,必須是0x424D,即字符串"BM" DWORD bfSize; //文件大小,,包括BITMAPFILEHEADER的14個字節(jié) WORD bfReserved1; //保留字 WORD bfReserved2; //保留字 DWORD bfOffBits; //從文件頭到實際的位圖數(shù)據(jù)的偏移字節(jié)數(shù) } BITMAPFILEHEADER; |
?。?)位圖信息頭BITMAPINFOHEADER
位圖信息頭BITMAPINFOHEADER也是一個結(jié)構(gòu)體,長度為40字節(jié),,定義為:
typedef struct tagBITMAPINFOHEADER { DWORD biSize; //本結(jié)構(gòu)的長度,,為40 LONG biWidth; //圖象的寬度,單位是象素 LONG biHeight; //圖象的高度,,單位是象素 WORD biPlanes; //必須是1 WORD biBitCount; //表示顏色時要用到的位數(shù),,1(單色), 4(16色), 8(256色), 24(真彩色) DWORD biCompression; //指定位圖是否壓縮,有效的值為BI_RGB,,BI_RLE8,,BI_RLE4,BI_BITFIELDS等,,BI_RGB表示不壓縮 DWORD biSizeImage; //實際的位圖數(shù)據(jù)占用的字節(jié)數(shù),,即 biSizeImage=biWidth’ × biHeight,biWidth’是biWidth 按照4的整倍數(shù)調(diào)整后的結(jié)果 LONG biXPelsPerMeter; //目標(biāo)設(shè)備的水平分辨率,單位是每米的象素個數(shù) LONG biYPelsPerMeter; //目標(biāo)設(shè)備的垂直分辨率,,單位是每米的象素個數(shù) DWORD biClrUsed; //位圖實際用到的顏色數(shù),,0表示顏色數(shù)為2biBitCount DWORD biClrImportant; //位圖中重要的顏色數(shù),0表示所有顏色都重要 } BITMAPINFOHEADER; |
?。?)調(diào)色板Palette
調(diào)色板Palette針對的是需要調(diào)色板的位圖,,即單色、16色和256色位圖,。對于不以調(diào)色板方式存儲的位圖,,則無此項信息。調(diào)色板是一個數(shù)組,,共有biClrUsed個元素(如果該值為0,,則有2biBitCount個元素)。數(shù)組中每個元素是一個RGBQUAD結(jié)構(gòu)體,,長度為4個字節(jié),,定義為:
typedef struct tagRGBQUAD { BYTE rgbBlue; //藍色分量 BYTE rgbGreen; //綠色分量 BYTE rgbRed; //紅色分量 BYTE rgbReserved; //保留值 } RGBQUAD; |
(4)實際的位圖數(shù)據(jù)ImageDate
對于用到調(diào)色板的位圖,,實際的圖象數(shù)據(jù)ImageDate為該象素的顏色在調(diào)色板中的索引值,;對于真彩色圖,圖象數(shù)據(jù)則為實際的R,、G,、B值:
a.單色位圖:用1bit就可以表示象素的顏色索引值;
b.16色位圖:用4bit可以表示象素的顏色索引值,;
c. 256色位圖:1個字節(jié)表示1個象素的顏色索引值,;
d.真彩色:3個字節(jié)表示1個象素的顏色R,G,,B值,。
此外,位圖數(shù)據(jù)每一行的字節(jié)數(shù)必須為4的整倍數(shù),,如果不是,,則需要補齊。奇怪的是,,位圖文件中的數(shù)據(jù)是從下到上(而不是從上到下),、從左到右方式存儲的。