轉自:http://blog.csdn.net/yixianfeng41/article/details/52591585 一、BMP文件由文件頭、點陣圖信息頭、顏色信息和圖形數據四部分組成。 顏色表用於說明點陣圖中的顏色,它有若幹個表項,每一個表項是一個RGBQUAD類型的結構,定義一種顏色。RGBQ ...
轉自:http://blog.csdn.net/yixianfeng41/article/details/52591585
一、BMP文件由文件頭、點陣圖信息頭、顏色信息和圖形數據四部分組成。
1、BMP文件頭(14位元組)
typedef struct /**** BMP file header structure ****/ { unsigned int bfSize; /* Size of file */ unsigned short bfReserved1; /* Reserved */ unsigned short bfReserved2; /* ... */ unsigned int bfOffBits; /* Offset to bitmap data */ } MyBITMAPFILEHEADER;
2、點陣圖信息頭(40位元組)
typedef struct /**** BMP file info structure ****/ { unsigned int biSize; /* Size of info header */ int biWidth; /* Width of image */ int biHeight; /* Height of image */ unsigned short biPlanes; /* Number of color planes */ unsigned short biBitCount; /* Number of bits per pixel */ unsigned int biCompression; /* Type of compression to use */ unsigned int biSizeImage; /* Size of image data */ int biXPelsPerMeter; /* X pixels per meter */ int biYPelsPerMeter; /* Y pixels per meter */ unsigned int biClrUsed; /* Number of colors used */ unsigned int biClrImportant; /* Number of important colors */ } MyBITMAPINFOHEADER;
3、顏色表
顏色表用於說明點陣圖中的顏色,它有若幹個表項,每一個表項是一個RGBQUAD類型的結構,定義一種顏色。RGBQUAD結構的定義如下:
typedef struct tagRGBQUAD{ BYTE rgbBlue;//藍色的亮度(值範圍為0-255) BYTE rgbGreen;//綠色的亮度(值範圍為0-255) BYTE rgbRed;//紅色的亮度(值範圍為0-255) BYTE rgbReserved;//保留,必須為0 }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) { MyBITMAPFILEHEADER bfh; MyBITMAPINFOHEADER bih; /* Magic number for file. It does not fit in the header structure due to alignment requirements, so put it outside */ unsigned short bfType=0x4d42; bfh.bfReserved1 = 0; bfh.bfReserved2 = 0; bfh.bfSize = 2+sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)+width*height*3; bfh.bfOffBits = 0x36; bih.biSize = sizeof(BITMAPINFOHEADER); bih.biWidth = width; bih.biHeight = height; bih.biPlanes = 1; bih.biBitCount = 24; bih.biCompression = 0; bih.biSizeImage = 0; bih.biXPelsPerMeter = 5000; bih.biYPelsPerMeter = 5000; bih.biClrUsed = 0; bih.biClrImportant = 0; FILE *file = fopen(filename, "wb"); if (!file) { printf("Could not write file\n"); return; } /*Write headers*/ fwrite(&bfType,sizeof(bfType),1,file); fwrite(&bfh,sizeof(bfh),1, file); fwrite(&bih,sizeof(bih),1, file); fwrite(rgbbuf,width*height*3,1,file); fclose(file); }