位图(bitmap)是使用像素矩阵来表示的图像。BMP文件中包含了位图中所有点的信息,每个像素的颜色信息由RGB值或者灰度值表示。单个像素颜色信息所需的数据可以用1、4、8、24、及32位等容量在存储,位数越高表示颜色越丰富,相应的数据量越大。
1.位图各点的颜色数据是按点的位置从下往上、从左到右依次排序的。
2.一个BMP文件可以依次分为4个部分:
1) 位图头 应用程序将检验此部分确保这是位图文件。
2) 位图信息 位图图像信息。供解读后面位图数据用。
3) 调色板 像素值所对应的颜色。
4) 位图数据 个像素的颜色数据或索引。
3.可以写一个程序将BMP文件的信息展示出来,如
#include
//Macro constant for *.bmp
#define BMP_FILENAME "p.bmp"
#define BYTES_IN_LINE 16
#define MAX_OUTPUT_BYTES 500000
//Macro function return constant
#define FUN_MID_RE -1
#define FUN_END_RE 0
//Function declare
int judge_bmp();
int main(void)
{
int i;
FILE *fp;
unsigned char byte;
int re;
//Judge if source file is a BMP
if( (re = judge_bmp() ) != 0){
printf("%s is not *.bmp\n", BMP_FILENAME);
return 0;
}
//Open BMP file
fp = fopen(BMP_FILENAME, "r");
if(fp == NULL){
perror("main");
return 0;
}
printf("\n*********------------------------%s---------------------\n", BMP_FILENAME);
//Read file byte by byte
//One byte is 8 bit
for(i = 0; i < MAX_OUTPUT_BYTES; i++){
//Offset of first byte in ith line
if(i % BYTES_IN_LINE == 0){
printf("%08X: ", i);
}
byte = fgetc(fp);
//File is end
if(feof(fp))
break;
printf("%02X ", byte);
if(i % BYTES_IN_LINE == BYTES_IN_LINE - 1){
printf("\n");
}else if(i % BYTES_IN_LINE == BYTES_IN_LINE/2 - 1){
//Split a libe to halves
printf(" ");
}
}
printf("\n*********------------------------%s---------------------\n", BMP_FILENAME);
return 0;
}
/*
* Define Function: judge_bmp().
* @return 0 if is a bmp file,
* -1 if is not a bmp file or
* can not open the source file.
*/
int judge_bmp()
{
FILE *fp;
unsigned char ch[2];
//Open file
fp = fopen(BMP_FILENAME, "r");
if(fp == NULL){
printf("Can not open %s\n", BMP_FILENAME);
return -1;
}
//Read the 0-1 byte to judge if the BMP file
ch[0] = fgetc(fp);
ch[1] = fgetc(fp);
if(ch[0] == 'B' && ch[1] == 'M'){
return 0;
}else {
return -1;
}
}
将一个10像素宽,10像素高名为p.bmp的文件上传到linux编写以上代码的当前目录,写、运行得到一下结果:
根据位图的格式,从字节0x36开始,就是位图的信息数据,从此处开始的三个字节(13 18 17对应于RGB颜色(0x17 0x 18 0x13))为图片左下角那个像素的颜色。这样的对应方式跟1.中描述的内容相一致。上图中个字节与位图的格式相对应。