1、顯示數據的存儲格式
先不考慮BMP文件的文件頭部分,顯示數據的存儲格式如下圖所示:
由上圖可見,BMP文件中的顯示數據是以行爲單位倒序存儲的,就是說圖片第一行的顯示數據存儲在文件數據的最後面一行,
圖片最後一行的顯示數據則保存在文件數據的第一行。
2、BMP圖片的文件頭
BMP圖片的文件頭可以用如下兩個結構體來表示,兩個結構體佔用的空間共爲54字節。
//14byte文件頭
typedef struct
{
char cfType[2]; //文件類型,"BM"(0x4D42)
long cfSize; //文件大小(字節)
long cfReserved;//保留,值爲0
long cfoffBits; //數據區相對於文件頭的偏移量(字節)
}__attribute__((packed)) BITMAPFILEHEADER;//__attribute__((packed))的作用是告訴編譯器取消結構在編譯過程中的優化對齊
//40byte信息頭
typedef struct
{
char ciSize[4]; //BITMAPFILEHEADER所佔的字節數
long ciWidth; //寬度
long ciHeight; //高度
char ciPlanes[2]; //目標設備的位平面數,值爲1
int ciBitCount; //每個像素的位數
char ciCompress[4]; //壓縮說明
char ciSizeImage[4];//用字節表示的圖像大小,該數據必須是4的倍數
char ciXPelsPerMeter[4];//目標設備的水平像素數/米
char ciYPelsPerMeter[4];//目標設備的垂直像素數/米
char ciClrUsed[4]; //位圖使用調色板的顏色數
char ciClrImportant[4]; //指定重要的顏色數,當該域的值等於顏色數時(或者等於0時),表示所有顏色都一樣重要
}__attribute__((packed)) BITMAPINFOHEADER;
3、顯示數據的對齊問題
BMP圖片內的顯示數據,按行進行4字節對齊,也就是說每一行顯示數據所佔據的存儲空間必須是4字節的整數倍,不足的部分要補零。
然後纔是下一行的顯示數據。對於深度爲24bit的圖片,每一行所佔據的空間大小可以通過如下方式計算:
size = (width * 3 + 3) / 4 * 4;
4、RGB888格式的BMP圖片顯示數據轉換爲可以直接顯示的RGB8888數據
int cursor_bitmap_format_convert(char *dst,char *src,unsigned int offset)
{
int i ,j ;
char *psrc = src ;
char *pdst = dst;
char *p = psrc;
/*
由於BMP顯示數據是按行從後面往前面存儲,
所以需要倒序進行轉換。
*/
for(i = height;i > 0; i--){
p = psrc + (i-1) * offset;
for(j = 0;j < width; j++){
*pdst++ = *p++;
*pdst++ = *p++;
*pdst++ = *p++;
*pdst++ = 0x00;
}
}
return 0;
}