如何把DC里的bitmap导出为BMP图

 我来答
秀米CN
2011-08-24 · TA获得超过362个赞
知道小有建树答主
回答量:157
采纳率:0%
帮助的人:154万
展开全部
这个功能前几天刚好实现了,实现这个功能在VS2010下很简单,但在VC6下就比较复杂了,看了半天还是没懂,现在就说说在VS2010下的实现方法。
首先获取屏幕位图的句柄:
这个就不用贴代码了吧,如果有需要可以继续问,大体上和楼上那位差不多。
获得句柄后:

CImage image; //CImage 在VC6中不支持
image.Attach(hBitmap); //hBitmap就是获得的句柄
image.Save(FileName); //将FileName改成你想要的文件名就行了。
image.Detach();

呵呵,简单吧,祝你成功
追问
这个名字如何填..LPCTSTR 怎么不让给路径啊.报错
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
o月光饼饼
2011-08-24 · 超过10用户采纳过TA的回答
知道答主
回答量:30
采纳率:0%
帮助的人:29.7万
展开全部
// 窗口DC和兼容设备描述表
HDC hs, hp;
HBITMAP hbitmap;
//创建设备描述表
hs = GetWindowDC();
//创建兼容的设备描述表
hp = CreateCompatibleDC(hs);
// 创建与设备描述表兼容的位图
hbitmap = CreateCompatibleBitmap(hs,100100);
// 把位图选到设备描述表中
SelectObject(hp, hbitmap);
// 把设备描述表拷贝到内存设备描述表中
BitBlt(hp,0,0,100,100, hs,0, 0, SRCCOPY);
DeleteDC(hs);
DeleteDC(hp);
return hbitmap;
更多追问追答
追问
我要的是导出bmp图..不是blt..导出到文件中
追答
HDC hdc;
DWORD dwbmbitssize, dwdibsize, dwwritten;
BITMAP bitmap; //位图属性结构
BITMAPFILEHEADER bmfhdr; //位图文件头结构
BITMAPINFOHEADER bi; //位图信息头结构
LPBITMAPINFOHEADER lpbi; //指向位图信息头结构
HANDLE fh, hdib, hpal,holdpal=NULL;
//设置位图信息头
GetObject(hbitmap, sizeof(BITMAP), (LPSTR)&bitmap);
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = bitmap.bmWidth;
bi.biHeight = bitmap.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = 24;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;
dwbmbitssize = ((bitmap.bmWidth * 24+31)/32)* 4 * bitmap.bmHeight ;
hdib = GlobalAlloc(GHND,dwbmbitssize + sizeof(BITMAPINFOHEADER));
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hdib);
*lpbi = bi;
// 处理调色板
hpal = GetStockObject(DEFAULT_PALETTE);
if (hpal)
{
hdc = ::GetDC(NULL);
holdpal = SelectPalette(hdc, (HPALETTE)hpal, false);
RealizePalette(hdc);
}

// 获取该调色板下新的像素值
GetDIBits(hdc, hbitmap, 0, (UINT) bitmap.bmHeight,(LPSTR)lpbi +
sizeof(BITMAPINFOHEADER),(BITMAPINFO*)lpbi, DIB_RGB_COLORS);

//创建位图文件
fh = CreateFile(“.\\temp.bmp”, GENERIC_WRITE, 0, NULL,
CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL|
FILE_FLAG_SEQUENTIAL_SCAN, NULL);
// 位图文件头
bmfhdr.bfType = 0x4d42;
dwdibsize = 54+ dwbmbitssize;
bmfhdr.bfSize = dwdibsize;
bmfhdr.bfReserved1 = 0;
bmfhdr.bfReserved2 = 0;
bmfhdr.bfOffBits = 54;

// 写入位图文件头
WriteFile(fh, (LPSTR)&bmfhdr, sizeof(BITMAPFILEHEADER), &dwwritten, NULL);
// 写入位图数据
WriteFile(fh,lpbi, dwdibsize, &dwwritten, NULL);
GlobalUnlock(hdib);
GlobalFree(hdib);
CloseHandle(fh);
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式