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, 只不過小端存儲(低位元組放在低地址)