解析BMP文件 [李园7舍_404]

位图(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.中描述的内容相一致。上图中个字节与位图的格式相对应。

你可能感兴趣的:(碚大)