BMP圖片的數據存儲格式說明及顯示數據的轉換

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;
}



















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章