int SaveBMP ( const unsigned char *_buf, const char *_name, const int _width, const int _height ) { int i, j; BITMAPFILEHEADER bmfh; memset ( &bmfh, 0, sizeof ( BITMAPFILEHEADER ) ); bmfh.bfType = 0x4d42; bmfh.bfSize = sizeof ( BITMAPFILEHEADER ) + sizeof ( BITMAPINFOHEADER ) + _width * _height * 3 + ( _width % 4 ) * _height + 2; bmfh.bfReserved1 = 0; bmfh.bfReserved2 = 0; bmfh.bfOffBits = sizeof ( BITMAPFILEHEADER ) + sizeof ( BITMAPINFOHEADER ); BITMAPINFOHEADER bmih; memset ( &bmih, 0, sizeof ( BITMAPINFOHEADER ) ); bmih.biSize = sizeof ( BITMAPINFOHEADER ); bmih.biWidth = _width; bmih.biHeight = _height; bmih.biPlanes = 1; bmih.biBitCount = 24; bmih.biCompression = BI_RGB; bmih.biSizeImage = 0; bmih.biXPelsPerMeter = 0; bmih.biYPelsPerMeter = 0; bmih.biClrUsed = 0; bmih.biClrImportant = 0; FILE *bmf = NULL; if ( fopen_s ( &bmf, _name, "wcb" ) != 0 ) return -1; fwrite ( &bmfh, sizeof ( BITMAPFILEHEADER ), 1, bmf ); fwrite ( &bmih, sizeof ( BITMAPINFOHEADER ), 1, bmf ); unsigned char c = 0; int index; for ( i = _height-1; i >= 0; i-- ) { for ( j = 0; j < _width; j++ ) { index = i*_width+j; c = _buf[index*4+2]; fwrite ( &c, sizeof ( unsigned char ), 1, bmf ); c = _buf[index*4+1]; fwrite ( &c, sizeof ( unsigned char ), 1, bmf ); c = _buf[index*4+0]; fwrite ( &c, sizeof ( unsigned char ), 1, bmf ); } c = 0; switch ( _width % 4 ) { case 3: fwrite ( &c, sizeof ( unsigned char ), 1, bmf ); case 2: fwrite ( &c, sizeof ( unsigned char ), 1, bmf ); case 1: fwrite ( &c, sizeof ( unsigned char ), 1, bmf ); case 0: break; } } c = 0; fwrite ( &c, sizeof ( unsigned char ), 1, bmf ); fwrite ( &c, sizeof ( unsigned char ), 1, bmf ); fflush ( bmf ); fclose ( bmf ); bmf = NULL; return 1; }
January 12, 2012
Save BMP file using win32 API
include : windows.h
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment