在Windows下保存BMP圖片還是挺方便的,直接上代碼,拷貝就能用
1 void savebmp(uchar * pdata, char * bmp_file, int width, int height )
2 { //分別為rgb數據,要保存的bmp文件名,圖片長寬
3 int size = width*height*3*sizeof(char); // 每個像素點3個字節
4 // 位圖第一部分,文件信息
5 BITMAPFILEHEADER bfh;
6 bfh.bfType = (WORD)0x4d42; //bm
7 bfh.bfSize = size // data size
8 + sizeof( BITMAPFILEHEADER ) // first section size
9 + sizeof( BITMAPINFOHEADER ) // second section size
10 ;
11 bfh.bfReserved1 = 0; // reserved
12 bfh.bfReserved2 = 0; // reserved
13 bfh.bfOffBits = sizeof( BITMAPFILEHEADER )+ sizeof( BITMAPINFOHEADER );//真正的數據的位置
14
15 // 位圖第二部分,數據信息
16 BITMAPINFOHEADER bih;
17 bih.biSize = sizeof(BITMAPINFOHEADER);
18 bih.biWidth = width;
19 bih.biHeight = -height;//BMP圖片從最後一個點開始掃描,顯示時圖片是倒著的,所以用-height,這樣圖片就正了
20 bih.biPlanes = 1;//為1,不用改
21 bih.biBitCount = 24;
22 bih.biCompression = 0;//不壓縮
23 bih.biSizeImage = size;
24 bih.biXPelsPerMeter = 2835 ;//像素每米
25 bih.biYPelsPerMeter = 2835 ;
26 bih.biClrUsed = 0;//已用過的顏色,24位的為0
27 bih.biClrImportant = 0;//每個像素都重要
28 FILE * fp = fopen( bmp_file,"wb" );
29 if( !fp ) return;
30
31 fwrite( &bfh, 8, 1, fp );//由於linux上4字節對齊,而信息頭大小為54字節,第一部分14字節,第二部分40字節,所以會將第一部分補齊為16自己,直接用sizeof,打開圖片時就會遇到premature end-of-file encountered錯誤
32 fwrite(&bfh.bfReserved2, sizeof(bfh.bfReserved2), 1, fp);
33 fwrite(&bfh.bfOffBits, sizeof(bfh.bfOffBits), 1, fp);
34 fwrite( &bih, sizeof(BITMAPINFOHEADER),1,fp );
35 fwrite(pdata,size,1,fp);
36 fclose( fp );
37 }
在其他環境要自己編寫 文件頭和信息頭等結構體,才能使用,可參考這篇博客。