生成BMP格式位图,附C++代码.DOC
生成BMP格式位图,附C++代码
?
USB视频摄像头的媒体格式为RGB24和I42
?
首先,我们了解一下BMP的格式,BMP有四部分组成,用表格表示如下:
?
?
?
?
?
1. 文件信息头
2. 位图信息头
3. 调色板
4. 位图数据
?
?
第一部分,文件信息头的格式如下:
typedef struct tagBITMAPFILEHEADER {
????????WORD????bfType;
????????DWORD???bfSize;
????????WORD????bfReserved1;
????????WORD????bfReserved2;
????????DWORD???bfOffBits;
} BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;
共有14个字节,其中bfType为文件类型,BMP的类型为0×4d42,也就是字母m和b;bfSize是文件大小,为1,2,3,4部分大小的总和;bfReserved1和bfReserved2为1,2,3部分大小的总和。
?
第二部分,位图信息头,定义如下:
typedef struct tagBITMAPINFOHEADER{
????????DWORD??????biSize;
????????LONG???????biWidth;
????????LONG???????biHeight;
????????WORD???????biPlanes;
????????WORD???????biBitCount;
????????DWORD??????biCompression;
????????DWORD??????biSizeImage;
????????LONG ??????biXPelsPerMeter;
????????LONG???????biYPelsPerMeter;
????????DWORD??????biClrUsed;
????????DWORD??????biClrImportant;
} BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;
总共40个字节,字段比较多,可以查看MSDN中的说明,对于RGB24的位图,这个结构体一般定义如下:
BITMAPINFOHEADER bih;
???????bih.biSize = sizeof(BITMAPINFOHEADER);
???????bih.biWidth = width;
???????bih.biHeight = height;
???????bih.biPlanes = 1;
???????bih.biBitCount = 24;
???????bih.biCompression = 0;
???????bih.biSizeImage = size;
???????bih.biXPelsPerMeter = 0;
???????bih.biYPelsPerMeter = 0;
???????bih.biClrUsed = 0;
???????bih.biClrImportant = 0;
?
第三部分是调色板信息,定义如下:
typedef struct tagRGBQUAD {
????????BYTE????rgbBlue;
????????BYTE????rgbGreen;
????????BYTE????rgbRed;
????????BYTE????rgbReserved;
} RGBQUAD;
这部分用来表示RGB各色的强度,一般情况我们不把这一部分写到文件中。
?
第四部分就是真正的数据,比如宽度和高度分别是320和240,这部分数据的长度应该为320*240*3(每个像素点上有3个字节,分别用来表示b,g,r的颜色)。
?
根据对BMP格式的说明,我们可以轻易的写出一个生成BMP图像的函数,如下所示:
?
// pData为rgb24数据,width为位图宽度,height为位图高度,filename为位图文件的名字
void Snapshot( BYTE * pData, int width, int height, const char * filename )
{
???????int size = width*height*3; // 每个像素点3个字节
?
???????// 位图第一部分,文件信息
???????BITMAPFILEHEADER bfh;
???????bfh.bfType = 0×4d42;??//bm
???????bfh.bfSize = size??// data size