📄 subject_16199.htm
字号:
<p>
序号:16199 发表者:wxfjb 发表日期:2002-09-26 13:07:25
<br>主题:关于抓图
<br>内容:本人正在写一个组件。要求抓取view中的内容并保存为.bmp文件。包括在滚动调制外看不到的部分也在保存。那位高人给指点一二。有代码更好,多谢!
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:徐景周 回复日期:2002-09-26 13:17:19
<br>内容:在内存DC中重绘你的图像,然后用GetDIBData获取并转换保存。<BR><BR>用法:<BR>LPVOID lpBuf;<BR> DWORD dwLength;<BR> BOOL bGetDIBData = FALSE;<BR> if ((lpBuf = GetDIBData(&memDC, dwLength))) //获取位图数据正确<BR> {<BR> //保存进度条前进<BR> pProgressBar.StepIt(); <BR><BR> CFile file;<BR> <BR> CString strFile;<BR> strFile = strFileName;<BR> if (file.Open( strFile, CFile::modeCreate | CFile::modeWrite))<BR> {<BR> file.WriteHuge(lpBuf, dwLength);<BR> file.Close();<BR> bGetDIBData = TRUE;<BR> }<BR> else<BR> {<BR> CString strERR = "不能创建位图文件!\nFile: ";<BR> strERR += strFile;<BR> AfxMessageBox(strERR, MB_OK | MB_ICONEXCLAMATION);<BR> }<BR> GlobalFreePtr(lpBuf); //释放位图数据缓冲区<BR> }<BR><BR>// ---------------------------------------------------------<BR>// 名称:GetDIBData<BR>// 功能: 从内存设备句柄中获取位图数据信息<BR>//<BR>// 变量:pDC -- 内存设备句柄指针<BR>// dwLength -- 位图数据缓冲区的长度(返值)<BR>// 返回:位图设备句柄指针<BR>//<BR>// 修改:徐景周<BR>// ---------------------------------------------------------<BR>LPVOID CTemplateEditorView::GetDIBData(CDC *pDC, DWORD &dwLength)<BR>{ <BR> LPBITMAPFILEHEADER lpBMFH; // DIB位图文件头指针<BR> LPBITMAPINFOHEADER lpBMIH; // DIB位图说明信息指针<BR> LPBITMAPINFO lpBMI; // DIB位图说明信息<BR> LPVOID lpData; // DIB位图数据指针<BR> LPVOID lpBuf; // DIB位图缓冲区数据指针<BR> <BR> BITMAP bm; // GDI位图数据结构<BR> CBitmap EmptyBitmap, *pBitmap;<BR> int nPaletteSize = 1; // DIB位图调色板大小<BR> DWORD dwBytes; // DIB位图每行的字节数<BR> int nBits; // DIB位图每个像素的颜色位面数<BR> <BR> // ------- 目的:为了获得原来的位图指针 ------- //<BR> EmptyBitmap.CreateCompatibleBitmap(pDC, 0, 0); // 临时空位图<BR> pBitmap = (CBitmap*)pDC->SelectObject(&EmptyBitmap);<BR> // ------------------------------------------ //<BR> pBitmap->GetObject(sizeof(bm), &bm); // 获取GDI位图数据<BR><BR> nBits = bm.bmPlanes * bm.bmBitsPixel; // 确定位图颜色位面及调色板长度<BR> nPaletteSize = (nBits == 1 || nBits == 4 || nBits == 8) ? (1 << nBits) : 0;<BR> <BR> dwBytes = ((DWORD)bm.bmWidth * nBits) / 32; // 确定位图每行的长度<BR> if (((DWORD)bm.bmWidth * nBits) % 32)<BR> dwBytes++;<BR> dwBytes *= 4; //以字节为单位的每行长度始终是4的倍数<BR><BR> dwLength = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * nPaletteSize;<BR> // 确定初始位图缓冲区大小<BR> // GHND = GMEM_MOVEABLE | GMEM_ZEROINIT;<BR> // GMEM_MOVEABLE : 分配可移动的内存区<BR> // GMEM_ZEROINIT :将内存区数据初始为0。<BR> if ((lpBuf = (char*)GlobalAllocPtr(GHND, dwLength)) == NULL)<BR> {<BR> //AfxMessageBox("DIB head memory allocte error !!");<BR> AfxMessageBox("无法分配位图内存!!");<BR> return NULL;<BR> }<BR><BR> lpBMFH = (LPBITMAPFILEHEADER)lpBuf;<BR> lpBMIH = (LPBITMAPINFOHEADER)((LPBYTE)lpBuf + sizeof(BITMAPFILEHEADER));<BR> lpBMI = (LPBITMAPINFO)lpBMIH; // BITMAPINFO = BITMAPINFOHEADER + RGBQUAD<BR> lpBMIH->biSize = sizeof(BITMAPINFOHEADER); // 设置位图初始头部信息<BR> lpBMIH->biWidth = bm.bmWidth;<BR> lpBMIH->biHeight = bm.bmHeight;<BR> lpBMIH->biPlanes = 1;<BR> lpBMIH->biBitCount = nBits; // 1, 4, 8, or 24<BR> if (nBits == 4)<BR> lpBMIH->biCompression = BI_RLE4;<BR> else if (nBits == 8)<BR> lpBMIH->biCompression = BI_RLE8;<BR> else<BR> lpBMIH->biCompression = BI_RGB; //非压缩格式<BR> lpBMIH->biSizeImage = 0;<BR> lpBMIH->biXPelsPerMeter = 0;<BR> lpBMIH->biYPelsPerMeter = 0;<BR> lpBMIH->biClrUsed = 0;<BR> lpBMIH->biClrImportant = 0;<BR><BR> // 获取GDI位图数据信息 --> lpBMI <BR> ::GetDIBits( pDC->GetSafeHdc(), <BR> (HBITMAP)pBitmap->GetSafeHandle(), <BR> 0, <BR> (WORD)bm.bmHeight, <BR> NULL, <BR> lpBMI, <BR> DIB_RGB_COLORS );<BR><BR> // 确定完整的DIB位图数据区大小<BR> if (lpBMIH->biSizeImage == 0) <BR> {<BR> dwLength += dwBytes * bm.bmHeight;<BR> lpBMIH->biCompression = BI_RGB; // 使用非压缩位图<BR> }<BR> else<BR> dwLength += lpBMIH->biSizeImage; // 使用压缩位图<BR> <BR> if ((lpBuf = (char*)GlobalReAllocPtr(lpBuf, dwLength, GHND)) == NULL)<BR> {<BR> //AfxMessageBox("DIB data memory allocte error !!");<BR> AfxMessageBox("无法分配位图内存!!");<BR> return NULL;<BR> }<BR> lpBMFH = (LPBITMAPFILEHEADER)lpBuf;<BR> lpBMIH = (LPBITMAPINFOHEADER)((LPBYTE)lpBuf + sizeof(BITMAPFILEHEADER));<BR> lpBMI = (LPBITMAPINFO)lpBMIH;<BR> lpData = (char*)lpBMIH + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * nPaletteSize;<BR><BR> lpBMFH->bfType = 0x4d42; // "BM"是DIB位图的标识串<BR> lpBMFH->bfSize = dwLength;<BR> lpBMFH->bfReserved1 = 0;<BR> lpBMFH->bfReserved2 = 0;<BR> lpBMFH->bfOffBits = (LPBYTE)lpData - (LPBYTE)lpBuf;<BR><BR> // 获取GDI位图数据-->lpData,lpBMI<BR> if ( !::GetDIBits( pDC->GetSafeHdc(), <BR> (HBITMAP)pBitmap->GetSafeHandle(), <BR> 0, <BR> (WORD)bm.bmHeight, <BR> lpData, <BR> lpBMI, <BR> DIB_RGB_COLORS) )<BR> {<BR> dwLength = 0;<BR> }<BR><BR> // 位图重新选入设备句柄<BR> pDC->SelectObject(pBitmap); <BR> EmptyBitmap.DeleteObject();<BR> <BR> return lpBuf; <BR>}<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:不说 回复日期:2002-09-28 02:13:52
<br>内容:CBitmap* pOldBitmap = pDC->SelectObject(pNewBitmap);<BR>Image* img = Image::FromHBITMAP((HBITMAP)pOldBitmap, NULL);<BR>CLSID encoderClsid;<BR>GetEncoderClsid(L"image/bmp", &encoderClsid);<BR>img->Save(L"ViewImage.bmp", &encoderClsid, NULL);<BR><BR>五句就可以搞定,为什么不用GDI+呢,呵呵……<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:凯凯 回复日期:2002-09-28 10:57:34
<br>内容:不说,那有GDI+的资料呀。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:不说 回复日期:2002-09-28 14:07:23
<br>内容:2001年11月以后的platform sdk的帮助里就有了,如果装了vs.net的话附带的msdn里就已经有了,不过俺更喜欢单装platform sdk呵呵……真的是挺好用的,封装了很多在GDI时代比较麻烦的功能,比如Gradient Brushes,Cardinal Splines,Scalable Regions,Alpha Blending等等,当然最舒服的还是加入了对jpeg,gif,tiff,png,bmp等文件格式的直接支持呵呵 ……<BR><BR>http://www.microsoft.com/msdownload/platformsdk/sdkupdate/<BR>这个地址里的core sdk部分包含了GDI+
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:凯凯 回复日期:2002-09-28 14:43:13
<br>内容:有Gradient Brushes!!!<BR>俺的消息也太落后了,这一阵想做一个立体按钮,我还自己在写这个算法。<BR><BR>赶快去看看选。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:不说 回复日期:2002-09-28 14:59:26
<br>内容:俺今年一月份的项目涉及到绘图的功能,因为以前没怎么太多接触过GDI所以先上网搜了关于GDI的资料,没想到蹦出来个GDI+,一开始还以为是第三方写的库,没想到竟然是ms自己搞出来的,还可以随application发布,于是大喜……<BR><BR>最有用的我觉得还是file format的那套函数,感觉是封装的ipicture,但是封装的实在是太太太简单好用了呵呵……绘图功能也去掉了GDI的几个比较讨厌的小地方,比如lineto的时候不包括最后一个点什么的,但是很奇怪,竟然没有roundrectangle……而且bitblt,strechblt,setrop2什么的好象都不太直观,不过GDI+和GDI并不冲突,而且互相的切换也很简单,这样两种方式交替使用呵呵恐怕就没有什么解决不了的问题了!<BR><BR>到现在觉得GDI+曾经给过的最大帮助就是可以读取GIF文件,而且可以直接将每一真都拆出来,还有播放间隔,次数等参数,甚至直接支持透明GIF的显示……
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -