在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 }
在其他环境要自己编写 文件头和信息头等结构体,才能使用,可参考这篇博客。