[转]RGB数据保存为BMP图片
转自: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/> }
转发申明:
本文转自互联网,由小站整理并发布,在于分享相关技术和知识。版权归原作者所有,如有侵权,请联系本站,将在24小时内删除。谢谢