1. 程式人生 > >BMP圖片頭部資訊

BMP圖片頭部資訊

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為負,那麼影象資料從上到下掃描