在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 }
在其他環境要自己編寫 文件頭和信息頭等結構體,才能使用,可參考這篇博客。