视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
将CBitmap类保存为bmp文件(VC++)
2025-10-06 04:42:37 责编:小OO
文档
做了一个截屏程序,提供了两种功能:将图象保存为文件,保存到剪切板。后面一种相对简单代码量少,将图像保存为文件相对复杂,网上也有很多这样的函数(但是基本上都来自一个版本),COPY了一个过来,不能运行,但我相信程序的大部分功能是好的,以前也没有接触过类似的东西,所以一步步把它看懂,然后修改正确,也对代码结构作了调整。相信能被更好的理解。

要保存为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/下载本文

显示全文
专题