BMP格式解析

一、介紹

  BMP文件格式,又稱為點陣圖,是Windows系統中廣泛使用的影像文件格式。
  BMP文件的數據分為四個部分:

  • bmp文件頭(bmp file header):提供文件的格式、大小等資訊
  • 點陣圖資訊頭(bitmap information):提供影像數據的尺寸、位平面數、壓縮方式、顏色索引等資訊
  • 調色板(color palette):可選,如使用索引來表示影像,調色板就是索引與其對應的顏色的映射表
  • 點陣圖數據(bitmap data):影像數據

 

二、程式碼示例

#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>

struct bmp_header
{ 
    unsigned short type; //文件類型
    unsigned int total_size; //整個點陣圖大小, 頭部 + 影像數據 單位位元組
    unsigned short reserved1;
    unsigned short reserved2;
    unsigned int valid_offset; //影像數據偏移量
} __attribute__((packed));

struct bmp_info  
{   
    unsigned int info_size; //該結構體大小, 固定40位元組 
    unsigned int bmp_width; //圖片寬度
    unsigned int bmp_height; //圖片高度
    unsigned short planes;  //總是1
    unsigned short bitcount; //像素多少位表示  
    unsigned int compression;  // 0:BI_RGB 不壓縮; ...... 
    unsigned int img_size; //影像有效數據大小, 單位位元組
    int x_pix_meter; //水平解析度, 像素/米 表示  
    int y_pix_meter;  //垂直解析度, 像素/米 表示  
    unsigned int color_used; //點陣圖實際使用彩色表中的顏色索引數,一般0
    unsigned int color_mportants; //color_used 上面使用的索引值重要數, 0表示都重要  
}__attribute__((packed));

int bmp_analyze(unsigned char *path)
{
    int fd = -1, i;
    struct bmp_header f_header;
    struct bmp_info  f_info;

    //打開bmp圖片
    fd = open(path, O_RDONLY);
    if (fd < 0) {
        printf("open %s error.\n", path);
        return -1;
    }
    
    //讀取文件頭資訊
    read(fd, &f_header, sizeof(struct bmp_header));
    printf("type:0x%x(%c%c)\n", f_header.type, f_header.type&0xff, (f_header.type>>8)&0xff);
    printf("total_size:%d\n", f_header.total_size);
    printf("reserved1:%d\n", f_header.reserved1);
    printf("reserved2:%d\n", f_header.reserved2);
    printf("valid_offset:%d\n", f_header.valid_offset);

    read(fd, &f_info, sizeof(struct bmp_info));
    printf("info_size:%d\n", f_info.info_size);
    printf("bmp_width:%d\n", abs(f_info.bmp_width));
    printf("bmp_height:%d\n", abs(f_info.bmp_height));
    printf("planes:%d\n", f_info.planes);
    printf("bitcount:%d\n", f_info.bitcount);

    printf("compression:%d\n", f_info.compression);
    printf("img_size:%d\n", f_info.img_size);
    printf("x_pix_meter:%d\n", f_info.x_pix_meter);
    printf("y_pix_meter:%d\n", f_info.y_pix_meter);
    printf("color_used:%d\n", f_info.color_used);
    printf("color_mportants:%d\n", f_info.color_mportants);

    //關閉打開的文件
    close(fd);

    return 0;
}

int main(int argc, char **argv)
{
    unsigned char *path = argv[1];

    if(path == NULL) {
        printf("invalid file path !!!\n");
        exit(-1);        
    } else {
        printf("read bmp file: %s\n", path);
    }
    
    bmp_analyze(path);

    return 0;
}

 

三、 效果

 ./a.out 24x32_3.bmp 
read bmp file: 24x32_3.bmp
type:0x4d42(BM)
total_size:3128
reserved1:0
reserved2:0
valid_offset:54
info_size:40
bmp_width:24
bmp_height:32
planes:1
bitcount:32
compression:0
img_size:3074
x_pix_meter:2834
y_pix_meter:2834
color_used:0
color_mportants:0

 

四、附件解析 

鏈接: //files-cdn.cnblogs.com/files/vedic/24x32_3.bmp    

 

 

 注意格式是ARGB8888, 只不過小端存儲(低位元組放在低地址)