RGB数据保存为BMP图片

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

1、BMP文件头(14字节)

[cpp]  view plain  copy
 
  1. typedef struct                       /**** BMP file header structure ****/  
  2. {  
  3.     unsigned int   bfSize;           /* Size of file */  
  4.     unsigned short bfReserved1;      /* Reserved */  
  5.     unsigned short bfReserved2;      /* ... */  
  6.     unsigned int   bfOffBits;        /* Offset to bitmap data */  
  7. } MyBITMAPFILEHEADER;  

2、位图信息头(40字节)

[cpp]  view plain  copy
 
  1. typedef struct                       /**** BMP file info structure ****/  
  2. {  
  3.     unsigned int   biSize;           /* Size of info header */  
  4.     int            biWidth;          /* Width of image */  
  5.     int            biHeight;         /* Height of image */  
  6.     unsigned short biPlanes;         /* Number of color planes */  
  7.     unsigned short biBitCount;       /* Number of bits per pixel */  
  8.     unsigned int   biCompression;    /* Type of compression to use */  
  9.     unsigned int   biSizeImage;      /* Size of image data */  
  10.     int            biXPelsPerMeter;  /* X pixels per meter */  
  11.     int            biYPelsPerMeter;  /* Y pixels per meter */  
  12.     unsigned int   biClrUsed;        /* Number of colors used */  
  13.     unsigned int   biClrImportant;   /* Number of important colors */  
  14. } MyBITMAPINFOHEADER;  

3、颜色表

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

[cpp]  view plain  copy
 
  1. typedefstructtagRGBQUAD{  
  2.     BYTErgbBlue;//蓝色的亮度(值范围为0-255)  
  3.     BYTErgbGreen;//绿色的亮度(值范围为0-255)  
  4.     BYTErgbRed;//红色的亮度(值范围为0-255)  
  5.     BYTErgbReserved;//保留,必须为0  
  6. }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图片的方法

[cpp]  view plain  copy
 
  1. void CDecVideoFilter::MySaveBmp(const char *filename,unsigned char *rgbbuf,int width,int height)  
  2. {  
  3.     MyBITMAPFILEHEADER bfh;  
  4.     MyBITMAPINFOHEADER bih;  
  5.     /* Magic number for file. It does not fit in the header structure due to alignment requirements, so put it outside */  
  6.     unsigned short bfType=0x4d42;             
  7.     bfh.bfReserved1 = 0;  
  8.     bfh.bfReserved2 = 0;  
  9.     bfh.bfSize = 2+sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)+width*height*3;  
  10.     bfh.bfOffBits = 0x36;  
  11.   
  12.     bih.biSize = sizeof(BITMAPINFOHEADER);  
  13.     bih.biWidth = width;  
  14.     bih.biHeight = height;  
  15.     bih.biPlanes = 1;  
  16.     bih.biBitCount = 24;  
  17.     bih.biCompression = 0;  
  18.     bih.biSizeImage = 0;  
  19.     bih.biXPelsPerMeter = 5000;  
  20.     bih.biYPelsPerMeter = 5000;  
  21.     bih.biClrUsed = 0;  
  22.     bih.biClrImportant = 0;  
  23.   
  24.     FILE *file = fopen(filename, "wb");  
  25.     if (!file)  
  26.     {  
  27.         printf("Could not write file\n");  
  28.         return;  
  29.     }  
  30.   
  31.     /*Write headers*/  
  32.     fwrite(&bfType,sizeof(bfType),1,file);  
  33.     fwrite(&bfh,sizeof(bfh),1, file);  
  34.     fwrite(&bih,sizeof(bih),1, file);  
  35.   
  36.     fwrite(rgbbuf,width*height*3,1,file);  
  37.     fclose(file);  
  38. }  


三、测试

具体测试代码:RGB TO BMP TEST


你可能感兴趣的:(视频会议系统)