CBitmap保存为Bmp文件 VC++ MFC实现

来源:互联网 发布:淘宝助理选择打印机 编辑:程序博客网 时间:2024/05/16 01:00

感谢这位同学的分享:http://wenku.baidu.com/view/f4f1580b76c66137ee061903.html

将下面函数复制到自己的类中,函数为:

void     CMyDlg::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();

}

在调用的时候,使用如下方式:

MySaveBmpTofile((HBITMAP)bitmap,"F:\\2.bmp");

 

 

原创粉丝点击