描述:
mic_lee2000 的截图代码,怎么直接保存图片到硬盘?
、引用 4 楼 mic_lee2000 的回复:
下面的代码肯定能用,也一定好用:
// 创建WebBrowser屏幕快照
HBITMAP CWebBrowser::CreateSnapShot()
{
IHTMLDocument2* pDoc = this->get_Document();
if(NULL == pDoc)
return NULL;
CComPtr <IHTMLDocument2> spDoc(pDoc);
pDoc->Release();
if(NULL == spDoc)
return NULL;
HRESULT hr;
CComPtr <IViewObject> spViewObject = NULL;
hr = spDoc->QueryInterface(IID_IViewObject,(void **)&spViewObject);
if(FAILED(hr) || NULL == spViewObject)
return NULL;
// get WebBrowser device context
HDC wndDC = ::GetWindowDC(this->m_hWnd);
HDC dc = ::CreateCompatibleDC(wndDC);
RECT rect;
GetWindowRect(&rect);
HBITMAP hBitmap = ::CreateCompatibleBitmap(wndDC,rect.right - rect.left,rect.bottom - rect.top);
if(NULL == hBitmap)
return NULL;
Gdiplus::Bitmap* bmp = Gdiplus::Bitmap::FromHBITMAP(hBitmap,NULL);
HGDIOBJ hobj = ::SelectObject(dc,(HGDIOBJ)hBitmap); // Select the Snapshot bitmap object;hobj
try
{
::Gdiplus::Graphics* g = ::Gdiplus::Graphics::FromHDC(dc);
g->Clear(Gdiplus::Color(255,255,255));
delete g;
g = NULL;
RECTL rectl;
rectl.top = 0;
rectl.left = 0;
rectl.right = rect.right - rect.left;
rectl.bottom = rect.bottom - rect.top;
DVASPECTINFO info;
info.cb = sizeof(info);
info.dwFlags = DVASPECTINFOFLAG_CANOPTIMIZE;
// draw screen snapshot.
hr = spViewObject->Draw(DVASPECT_CONTENT,-1,
&info,NULL,NULL,dc,&rectl,&rectl,NULL,0);
}
catch(...)
{
ATLTRACE2(atlTraceCOM,2,_T("create a webbrowser thumb failed...."));
}
::SelectObject(dc,hobj);
::DeleteDC(dc);
return hBitmap;
}
这个代码,怎么实现保存图片. ?
解决方案1:
将HBITMAP保存为BMP文件的代码一般如下:
WORD wbitsCount;//位图中每个像素所占字节数。
DWORD dwpalettelsize=0;//调色板大小
DWORD dwbmdibitsize,dwdibsize,dwwritten;
BITMAP bitmap;//定义了位图的各种的信息。
BITMAPFILEHEADER bmfhdr;//定义了大小、类型等BMP文件的信息。
BITMAPINFOHEADER bi;
LPBITMAPINFOHEADER lpbi;
HANDLE fh,fdib;
GetObject(hBitmap,sizeof(BITMAP),(void *)&bitmap);//得到BITMAP结构。
//以下代码是用BITMAP的信息填充BITMAPINFOHEADER结构
wbitsCount=bitmap.bmBitsPixel;
bi.biSize=sizeof(BITMAPINFOHEADER);
bi.biWidth=bitmap.bmWidth;
bi.biHeight=bitmap.bmHeight;
bi.biPlanes=1;
bi.biBitCount= bitmap.bmBitsPixel ;
bi.biClrImportant=0;
bi.biClrUsed=0;
bi.biCompression=BI_RGB;
bi.biSizeImage=0;
bi.biYPelsPerMeter=0;
bi.biXPelsPerMeter=0;
//以下代码是获取调色板的长度,调色板现在的用处很少,因为256色的位图已经不多了。
if(wbitsCount<=8)
dwpalettelsize=(1<<wbitsCount)*sizeof(RGBQUAD);
//计算位图的大小,并分配相应的内存空间,注意的是没有分配BITMAPFILEHEADER。
dwbmdibitsize=((bitmap.bmWidth*wbitsCount+31)/8)*bitmap.bmHeight;
fdib=GlobalAlloc(GHND,dwbmdibitsize+dwpalettelsize+sizeof(BITMAPINFOHEADER));
lpbi=(LPBITMAPINFOHEADER)::GlobalLock(fdib);
*lpbi=bi;//将bi中的数据写入分配的内存中。
hdc=::GetDC(NULL);
GetDIBits(hdc,hBitmap,0,(UINT)bitmap.bmHeight,(LPSTR)lpbi+sizeof(BITMAPINFOHEADER)+dwpalettelsize,(BITMAPINFO *)lpbi,DIB_RGB_COLORS);
/*GetDIBits是最重要的函数,真正获得位图数据的工作就由它完成,它第一个参数为HDC,第二个参数为位图句柄,第三个参数为扫描行的开始行,一般为0,第四个为结束行,一般就是高度,第四个参数最重要,它表示接收数据的起始地址,这个地址一般是在调色板之后。第五个参数指的是接收BITMAPINFO结构的地址,这个结构上面没有写,它其实就是BITMAPINFO结构加上调色板信息。最后一个参数是格式。一般是DIB_RGB_COLORS*/
//创建文件以及文件信息头
fh=CreateFile(FileName,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN,NULL);
if(fh==INVALID_HANDLE_VALUE)
return FALSE;
bmfhdr.bfType=0x4d42;//BMP类型,一定要这样写
dwdibsize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwbmdibitsize+dwpalettelsize;//文件总长,由几个部分组成
bmfhdr.bfSize=dwdibsize;
bmfhdr.bfReserved1=0;
bmfhdr.bfReserved2=0;
bmfhdr.bfOffBits=(DWORD)sizeof(BITMAPFILEHEADER)+(DWORD)sizeof(BITMAPINFOHEADER)+dwpalettelsize;//位图数据相对于文件头的偏移量
//将文件信息头写入文件
WriteFile(fh,(LPSTR)&bmfhdr,sizeof(BITMAPFILEHEADER),&dwwritten,NULL);
//将数据写入文件,包含BITMAPINFO结构、调色板、数据
WriteFile(fh,(LPSTR)lpbi,dwdibsize,&dwwritten,NULL);
//关闭相关句柄
::GlobalUnlock(fdib);
::GlobalFree(fdib);
::CloseHandle(fh);
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wltg2001/archive/2008/04/17/2300258.aspx