转自:http://blog.csdn.net/yixianfeng41/article/details/52591585

一、BMP文件由文件头、位图信息头、颜色信息和图形数据四部分组成。

1、BMP文件头(14字节)
typedef struct                       /**** BMP file header structure ****/<br/>
{<br/>
    unsigned int   bfSize;           /* Size of file */<br/>
    unsigned short bfReserved1;      /* Reserved */<br/>
    unsigned short bfReserved2;      /* ... */<br/>
    unsigned int   bfOffBits;        /* Offset to bitmap data */<br/>
} MyBITMAPFILEHEADER;
2、位图信息头(40字节)
typedef struct                       /**** BMP file info structure ****/<br/>
{<br/>
    unsigned int   biSize;           /* Size of info header */<br/>
    int            biWidth;          /* Width of image */<br/>
    int            biHeight;         /* Height of image */<br/>
    unsigned short biPlanes;         /* Number of color planes */<br/>
    unsigned short biBitCount;       /* Number of bits per pixel */<br/>
    unsigned int   biCompression;    /* Type of compression to use */<br/>
    unsigned int   biSizeImage;      /* Size of image data */<br/>
    int            biXPelsPerMeter;  /* X pixels per meter */<br/>
    int            biYPelsPerMeter;  /* Y pixels per meter */<br/>
    unsigned int   biClrUsed;        /* Number of colors used */<br/>
    unsigned int   biClrImportant;   /* Number of important colors */<br/>
} MyBITMAPINFOHEADER;
3、颜色表

颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD类型的结构,定义一种颜色。RGBQUAD结构的定义如下:

typedef struct tagRGBQUAD{<br/>
    BYTE rgbBlue;//蓝色的亮度(值范围为0-255)<br/>
    BYTE rgbGreen;//绿色的亮度(值范围为0-255)<br/>
    BYTE rgbRed;//红色的亮度(值范围为0-255)<br/>
    BYTE rgbReserved;//保留,必须为0<br/>
}RGBQUAD;

颜色表中的RGBQUAD结构数据的个数由biBitCount来确定:当biBitCount=1,4,8时,分别为2,16,256个表项;当biBitCount=24时,没有颜色表项。

4、位图数据

位图数据记录了位图的每一个像素值,记录顺序是在扫描行内是从左到右,扫描行之间是从下到上。位图的一个像素值所占的字节数:

当biBitCount=1时,8个像素占1个字节;

当biBitCount=4时,2个像素占1个字节;

当biBitCount=8时,1个像素占1个字节;

当biBitCount=24时,1个像素占3个字节,按顺序分别为B,G,R;

二、将rgb数据保存为bmp图片的方法

void CDecVideoFilter::MySaveBmp(const char *filename,unsigned char *rgbbuf,int width,int height)<br/>
{<br/>
    MyBITMAPFILEHEADER bfh;<br/>
    MyBITMAPINFOHEADER bih;<br/>
    /* Magic number for file. It does not fit in the header structure due to alignment requirements, so put it outside */<br/>
    unsigned short bfType=0x4d42;<br/>
    bfh.bfReserved1 = ;<br/>
    bfh.bfReserved2 = ;<br/>
    bfh.bfSize = +sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)+width*height*;<br/>
    bfh.bfOffBits = 0x36;  

    bih.biSize = sizeof(BITMAPINFOHEADER);<br/>
    bih.biWidth = width;<br/>
    bih.biHeight = height;<br/>
    bih.biPlanes = ;<br/>
    bih.biBitCount = ;<br/>
    bih.biCompression = ;<br/>
    bih.biSizeImage = ;<br/>
    bih.biXPelsPerMeter = ;<br/>
    bih.biYPelsPerMeter = ;<br/>
    bih.biClrUsed = ;<br/>
    bih.biClrImportant = ;  

    FILE *file = fopen(filename, "wb");<br/>
    if (!file)<br/>
    {<br/>
        printf("Could not write file\n");<br/>
        return;<br/>
    }  

    /*Write headers*/<br/>
    fwrite(&bfType,sizeof(bfType),,file);<br/>
    fwrite(&bfh,sizeof(bfh),, file);<br/>
    fwrite(&bih,sizeof(bih),, file);  

    fwrite(rgbbuf,width*height*,,file);<br/>
    fclose(file);<br/>
}