BMP圖片頭部資訊
阿新 • • 發佈:2018-12-08
BMP圖片是未經壓縮的圖片,其內容包括頭資訊和顏色有效資訊
頭資訊包括下面幾個部分:檔案頭,資訊頭,調色盤
我們可以使用一個結構體來表示頭部資訊
/* * 這句話的意思是地址採用1位元組對齊 * 由於gcc預設是4位元組對齊,而我們這裡需要和bmp的頭部資訊一一對應,所以應該採用1位元組對齊方式 */ #pragma pack (1) typedef struct { uint8_t bf_type[2]; // 2Bytes,必須為"BM",即0x424D 才是Windows點陣圖檔案 uint32_t bf_size; // 4Bytes,整個BMP檔案的大小 uint16_t bf_reserved1; // 2Bytes,保留,為0 uint16_t bf_reserved2; // 2Bytes,保留,為0 uint32_t bf_off_bits; // 4Bytes,檔案起始位置到影象畫素資料的位元組偏移量 } t_bmp_file_header; typedef struct { uint32_t bi_size; // 4Bytes,INFOHEADER結構體大小,存在其他版本I NFOHEADER,用作區分 uint32_t bi_width; // 4Bytes,影象寬度(以畫素為單位) int32_t bi_height; // 4Bytes,影象高度,+:影象儲存順序為Bottom2Top,-:Top2Bottom uint16_t bi_planes; // 2Bytes,影象資料平面,BMP儲存RGB資料,因此總為1 uint16_t bi_bit_count; // 2Bytes,影象畫素位數 uint32_t bi_compression; // 4Bytes,0:不壓縮,1:RLE8,2:RLE4 uint32_t bi_image_size; // 4Bytes,4位元組對齊的影象資料大小 uint32_t bi_x_pels_per_meter; // 4Bytes,用象素/米表示的水平解析度 uint32_t bi_y_pels_per_meter; // 4Bytes,用象素/米表示的垂直解析度 uint32_t bi_clr_used; // 4Bytes,實際使用的調色盤索引數,0:使用所有的調色盤索引 uint32_t bi_clr_important; // 4Bytes,重要的調色盤索引數,0:所有的調色盤索引都重要 } t_bmp_info_hearder; typedef struct { uint8_t bp_blue; // 指定藍色強度 uint8_t bp_green; // 指定綠色強度 uint8_t bp_red; // 指定紅色強度 uint8_t bp_reserved; //保留,設定為0 } t_bmp_pallet; typedef struct { t_bmp_file_header bmp_file_header; t_bmp_info_hearder bmp_info_hearder; t_bmp_pallet bmp_pallet; } t_bmp_header; /* 取消地址對齊 */ #pragma pack ()
其中需要注意的是int32_t bi_height;
如果bi_height為正,那麼影象資料從下到上掃描
如果bi_height為負,那麼影象資料從上到下掃描