一、使用到的結構體
- BMP文件頭結構。注意該結構的字節對齊,尤其是自定義該結構體時要引起高度重視,否則會引發BMP文件頭無效。
typedef struct tagBITMAPFILEHEADER
{
unsigned short bfType; //位圖文件的類型,必須爲BM
unsigned long bfSize; //文件大小,以字節爲單位
unsigned short bfReserverd1; //位圖文件保留字,必須爲0
unsigned short bfReserverd2; //位圖文件保留字,必須爲0
unsigned long bfbfOffBits; //位圖文件頭到數據的偏移量,以字節爲單位
}BITMAPFILEHEADER;
2.BMP信息頭結構
typedef struct tagBITMAPINFOHEADER
{
unsigned long biSize; //該結構大小,字節爲單位
long biWidth; //圖形寬度以象素爲單位
long biHeight; //圖形高度以象素爲單位
unsigned short biPlanes; //目標設備的級別,必須爲1
unsigned short biBitcount; //顏色深度,每個象素所需要的位數
unsigned long biCompression; //位圖的壓縮類型
unsigned long biSizeImage; //位圖的大小,以字節爲單位
long biXPelsPermeter; //位圖水平分辨率,每米像素數
long biYPelsPermeter; //位圖垂直分辨率,每米像素數
unsigned long biClrUsed; //位圖實際使用的顏色表中的顏色數
unsigned long biClrImportant; //位圖顯示過程中重要的顏色數
}BITMAPINFOHEADER;
3.BMP顏色表結構(調色板)
typedef struct tagRGBQUAD
{
unsigned char rgbBlue;
unsigned char rgbGreen;
unsigned char rgbRed;
unsigned char rgbReserved;
}RGBQUAD;
二、數據填充
所有保留字段都要置爲0,否則會出錯。
圖像寬度必須爲四的整數倍((((bi.biWidth * bi.biBitCount) + 31) & ~31) / 8);
1. BITMAPFILEHEADER
bfType爲圖像文件格式,就此題而論,總是設置爲0x4D42即“BM”;
bfSize爲BMP文件的大小,應設置爲:BMP文件頭大小+BMP信息頭大小+[調色板信息大小+]圖像大小,即:sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) +[ 256 * sizeof(RGBQUAD) +] imgHeight * imgWidth*bytePerPixel。圖像尺寸大小不包括顏色通道數量信息;
bfbfOffBits爲圖像數據的偏移字節。應設置爲:BMP文件大小+BMP信息頭大小[+調色板信息大小],計算方法參考上一字段;
2. BITMAPINFOHEADER
biSize該結構大小,一般設置爲40,推薦使用sizeof(BITMAPINFOHEADER)方式設置;
biWidth 圖像寬度,毋庸多言;
biSizeImage
biHeight 圖像高度;
biPlanes 位圖的位面數(目標設備級別),此處設置爲1;但也有設置爲零的,可見不一定爲1;
biBitcount 位圖每個像素所需位數,根據實際情況設置;1:爲雙色;4:十六色;8:256色;24或32:真彩色;
biCompression位圖壓縮類型,必須是0; 1:BI_RLE8壓縮類型;2:BI_RLE4壓縮類型;3:Bitfields,位域存放;
RLE:全稱(run-length encoding),翻譯爲遊程編碼;
biSizeImage位圖數據大小,即imgHeight*imgWidth*bytePerPixel;
biXPelsPermeter用像素/米表示的水平分辨率
biYPelsPermeter用像素/米表示的垂直分辨率
biClrUsed位圖所使用的顏色數
biClrImportant對位圖顯示有重要影響的顏色索引數。如果爲零,意味着都重要;
3. RGBQUAD
rgbBlue藍色分量的亮度0~255;
rgbGreen綠色分量的亮度0~255;
rgbRed紅色分量的亮度0~255;
rgbReserved保留分量,個人分析是Alpha分量的值,該值必須爲0;
4.位圖數據部分
上下左右倒置結構,左上角的像素點位於文件結尾,右下角的像素數據位於位圖數據段的起點。