要保存为BMP文件,首先肯定要了解BMP文件的格式。网上查资料知BMP文件的结构可以分为三个部分:
1,文件的头结构,记录了整个文件的大小,图象类型,MFC类型为BITMAPFILEHEADER
2。图象信息的头结构,记当了图象的一些信息,如大小,颜色深度等。类型为:BITMAPINFOHEADER
3. 图象各个象素的颜色值,这部分应该是文件的主体了。
有了以上的信息要保存BMP文件的步骤就很明显了。创建这两个结构,并初始化,边同象素颜色值写入文件即可,我下面的代码遵循的就是这个步骤,所以感觉条理应该比较清楚。
直接上代码(以下代码在VC 6。0中通过测试)
void MySaveBmpTofile(HBITMAP hbmp, CString path)
{
//参数说明: hbmp :需保存的图象的句柄 path :保存路径
//定义文件头结构
BITMAPFILEHEADER fileHead;
int fileHeadLen = sizeof( BITMAPFILEHEADER );
//定义图象信息结构
BITMAPINFOHEADER bmpHead;
int bmpHeadLen =sizeof( BITMAPINFOHEADER );
BITMAP bmpObj;
GetObject( hbmp, sizeof(BITMAP), &bmpObj );
DWORD fileSizeInByte; //文件总的字节大小
//获取系统颜色深度,即每个象素用多少位表还示
DWORD PixelSizeInBit;
CDC srcDC; //系统屏幕设备描述表
srcDC.CreateDC( "DISPLAY", NULL, NULL, NULL);
PixelSizeInBit=srcDC.GetDeviceCaps( BITSPIXEL ) * srcDC.GetDeviceCaps( PLANES );
fileSizeInByte = fileHeadLen + bmpHeadLen + bmpObj.bmWidth*bmpObj.bmHeight*PixelSizeInBit/8;
//初始化文件头结构
fileHead.bfOffBits = fileHeadLen + bmpHeadLen;
fileHead.bfReserved1=0;
fileHead.bfReserved2=0;
fileHead.bfSize = fileSizeInByte;
fileHead.bfType = 0x4D42;
///初始图像信息结构
bmpHead.biBitCount = PixelSizeInBit;
bmpHead.biCompression = BI_RGB;
bmpHead.biPlanes = 1;
bmpHead.biHeight = bmpObj.bmHeight;
bmpHead.biWidth = bmpObj.bmWidth;
bmpHead.biSize = bmpHeadLen;
//为文件分配空间
PBYTE pFile=new byte[ fileSizeInByte ];
memset( pFile, 0, fileSizeInByte );
//填充文件头部
memcpy( pFile, (PBYTE)&fileHead, fileHeadLen);
//填充文件信息头部结构
memcpy( pFile+fileHeadLen, (PBYTE)&bmpHead, bmpHeadLen);
//填充象素部分
GetDIBits( srcDC.m_hDC, hbmp, 0, bmpObj.bmHeight, pFile+fileHeadLen+bmpHeadLen, (LPBITMAPINFO)(pFile+fileHeadLen), DIB_RGB_COLORS);
//打开文件并写入数据
HANDLE hFile;
hFile=CreateFile( path, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if( hFile==INVALID_HANDLE_VALUE )
{
MessageBox( "创建文件失败" );
return;
}
DWORD nByteTransfered;
WriteFile( hFile, pFile, fileSizeInByte, &nByteTransfered, NULL);
CloseHandle( hFile );
//清理
delete pFile;
srcDC.DeleteDC();
}
保存成功以后,可以用16进制编辑器,打开BMP文件,可以按照在pFile中写入的顺序对里面的文件进行解析,第一个双字节正是写入的0x4D42,哈哈。比较激动一个个16进制码组成的是一幅完整的图片。
http://blog.163.com/lgy-047/blog/static/613465652010185018854/下载本文