C语言用句柄显示bmp图片,使用位图句柄,将其保存为BMP文件

使用位图句柄,将其保存为BMP文件

2011年05月02日

要通过与设备无关的位图句柄来将位图写入BMP文件,首先要了解BMP文件的结构,BMP文件由3到4个部分组成,第一部分是文件头(BITMAPFILEHEADER),再后面是文件信息头部分(BITMAPINFOHEADER),再往后如果还有的话就是颜色表,颜色表是可以有,也可以没有的,再往后就是图像数据部分了。

void SaveBmpFile(HBITMAP hBitmap)

{

//选择保存路径

CFileDialog cfd(FALSE,NULL,NULL,6UL,"*.bmp");

if(cfd.DoModal()==IDOK)

{

CString fileName=cfd.GetPathName();

int nPos = fileName.Find(".");

if(nPos == -1)

fileName += ".bmp";

CFile file(fileName,CFile::modeCreate|CFile::modeWrite);

//获取位图对象

CBitmap *pBmp = CBitmap::FromHandle(hBitmap);

BITMAP bitmap;

pBmp->GetObject(sizeof(bitmap),&bitmap);

//设置位图文件头

BITMAPFILEHEADER bmpHeader;

BITMAPINFOHEADER bmpInfo;

DWORD fileSize;

//获取文件长度

CDC dc;

dc.CreateDCA("DISPLAY",NULL,NULL,NULL);

dc.SelectObject(pBmp);

//计算

fileSize = sizeof(bmpHeader) + sizeof(bmpInfo) + bitmap.bmWidth * bitmap.bmHeight * bitmap.bmBitsPixel / 8;

//设置文件头结构

::memset(&bmpHeader,0,sizeof(BITMAPFILEHEADER));

bmpHeader.bfType = MAKEWORD('B','M');

bmpHeader.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);

bmpHeader.bfSize = fileSize;

//设置位图信息头结构

bmpInfo.biBitCount = bitmap.bmBitsPixel;

bmpInfo.biCompression = BI_RGB;

bmpInfo.biPlanes = 1;

bmpInfo.biWidth = bitmap.bmWidth;

bmpInfo.biHeight = bitmap.bmHeight;

bmpInfo.biSize = sizeof(bmpInfo);

//将位图写入文件

file.Write(&bmpHeader,sizeof(bmpHeader));

file.Write(&bmpInfo,sizeof(bmpInfo));

//写入图像数据部分

BYTE *pBuffer = new BYTE[fileSize - bmpHeader.bfOffBits];

::memset(pBuffer,0,fileSize-bmpHeader.bfOffBits);

GetDIBits(dc.m_hDC,hBitmap,0,bitmap.bmHeight,pBuffer,(LPBITMAPINFO)&bmpInfo,DIB_RGB_COLORS); //获取图像数据

file.Write(pBuffer,fileSize-bmpHeader.bfOffBits); //写入图像数据

file.Flush();

file.Close();

delete[] pBuffer;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值