[转]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小时内删除。谢谢
