VC将指定区域保存为图片.doc_第1页
VC将指定区域保存为图片.doc_第2页
VC将指定区域保存为图片.doc_第3页
VC将指定区域保存为图片.doc_第4页
VC将指定区域保存为图片.doc_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1.HBITMAP CopyScreenToBitmap(LPRECT lpRect);/将屏幕指定区域存成图片HBITMAP CopyScreenToBitmap(LPRECT lpRect) /lpRect 代表选定区域HDC hScrDC, hMemDC; / 屏幕和内存设备描述表HBITMAP hBitmap,hOldBitmap; / 位图句柄int nX, nY, nX2, nY2; / 选定区域坐标int nWidth, nHeight; / 位图宽度和高度int xScrn, yScrn; / 屏幕分辨率/ 确保选定区域不为空矩形if (IsRectEmpty(lpRect)return NULL;/为屏幕创建设备描述表hScrDC = CreateDC(_T(DISPLAY), NULL, NULL, NULL);/为屏幕设备描述表创建兼容的内存设备描述表hMemDC = CreateCompatibleDC(hScrDC);/ 获得选定区域坐标nX = lpRect-left;nY = lpRect-top;nX2 = lpRect-right;nY2 = lpRect-bottom;/ 获得屏幕分辨率xScrn = GetDeviceCaps(hScrDC, HORZRES);yScrn = GetDeviceCaps(hScrDC, VERTRES);/确保选定区域是可见的if (nX 0) nX = 0;if (nY xScrn) nX2 = xScrn;if (nY2 yScrn) nY2 = yScrn;nWidth = nX2 - nX;nHeight = nY2 - nY;/ 创建一个与屏幕设备描述表兼容的位图hBitmap=CreateCompatibleBitmap(hScrDC,nWidth,nHeight);/ 把新位图选到内存设备描述表中hOldBitmap=(HBITMAP)SelectObject(hMemDC,hBitmap);/ 把屏幕设备描述表拷贝到内存设备描述表中BitBlt(hMemDC,0,0, nWidth,nHeight,hScrDC, nX, nY, SRCCOPY);/得到屏幕位图的句柄hBitmap=(HBITMAP)SelectObject(hMemDC,hOldBitmap);/清除 DeleteDC(hScrDC);DeleteDC(hMemDC);/ 返回位图句柄return hBitmap;2.HBITMAP GetSrcBit(HDC hDC,LPRECT rEct)/设置一个成员变量m_hBitmap ,在OnDraw 或者 OnPaint中调用,从内存中首先获得它,而不像第一个函数那样,临时去截屏幕,因为如果突然在截图的瞬间最小化了窗口,那么函数1截取的范围就不是我们所需要的了。HBITMAP GetSrcBit(HDC hDC,LPRECT rEct)HDC hBufDC;HBITMAP hBitmap, hBitTemp;/创建设备上下文(HDC)hBufDC = CreateCompatibleDC(hDC);/创建HBITMAPhBitmap = CreateCompatibleBitmap(hDC, abs(rEct-right - rEct-left), abs(rEct-bottom - rEct-top);hBitTemp = (HBITMAP) SelectObject(hBufDC, hBitmap);/得到位图缓冲区StretchBlt(hBufDC, 0, 0, abs(rEct-right - rEct-left), abs(rEct-bottom - rEct-top),hDC, rEct-left, rEct-top, abs(rEct-right - rEct-left), abs(rEct-bottom - rEct-top), SRCCOPY);/得到最终的位图信息hBitmap = (HBITMAP) SelectObject(hBufDC, hBitTemp);/释放内存DeleteObject(hBitTemp);:DeleteDC(hBufDC);return hBitmap;3.bool SaveBMPToFile(HBITMAP hBitmap, LPSTR lpFileName);/将图片存成bmp文件bool SaveBMPToFile(HBITMAP hBitmap, LPSTR lpFileName) /hBitmap 为刚才的屏幕位图句柄,lpFileName 为位图文件名HDC hDC; /设备描述表int iBits; /当前显示分辨率下每个像素所占字节数WORD wBitCount; /位图中每个像素所占字节数/定义调色板大小, 位图中像素字节大小 , 位图文件大小 , 写入文件字节数DWORD dwPaletteSize=0,dwBmBitsSize,dwDIBSize, dwWritten;BITMAP Bitmap; /位图属性结构BITMAPFILEHEADER bmfHdr; /位图文件头结构BITMAPINFOHEADER bi; /位图信息头结构 LPBITMAPINFOHEADER lpbi; /指向位图信息头结构HANDLE fh, hDib, hPal;HPALETTE hOldPal=NULL; /定义文件,分配内存句柄,调色板句柄/计算位图文件每个像素所占字节数hDC = CreateDC(_T(DISPLAY),NULL,NULL,NULL);iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);DeleteDC(hDC);if (iBits = 1) wBitCount = 1;else if (iBits = 4) wBitCount = 4;else if (iBits = 8) wBitCount = 8;else if (iBits = 24) wBitCount = 24;else wBitCount = 32;/计算调色板大小if (wBitCount = 8) dwPaletteSize = (1wBitCount) * sizeof(RGBQUAD);/设置位图信息头结构GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap);bi.biSize = sizeof(BITMAPINFOHEADER);bi.biWidth = Bitmap.bmWidth;bi.biHeight = Bitmap.bmHeight;bi.biPlanes = 1;bi.biBitCount = wBitCount;bi.biCompression = BI_RGB;bi.biSizeImage = 0;bi.biXPelsPerMeter = 0;bi.biYPelsPerMeter = 0;bi.biClrUsed = 0;bi.biClrImportant = 0;dwBmBitsSize = (Bitmap.bmWidth*wBitCount+31)/32)*4*Bitmap.bmHeight; /为位图内容分配内存/*xxxxxxxx计算位图大小分解一下(解释一下上面的语句)xxxxxxxxxxxxxxxxxxxx /每个扫描行所占的字节数应该为4的整数倍,具体算法为:int biWidth = (Bitmap.bmWidth*wBitCount) / 32;if(Bitmap.bmWidth*wBitCount) % 32)biWidth+; /不是整数倍的加1biWidth *= 4;/到这里,计算得到的为每个扫描行的字节数。dwBmBitsSize = biWidth * Bitmap.bmHeight;/得到大小xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/hDib = GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+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)+dwPaletteSize, (BITMAPINFO *)lpbi,DIB_RGB_COLORS);/恢复调色板 if (hOldPal)SelectPalette(hDC, hOldPal, TRUE);RealizePalette(hDC);:ReleaseDC(NULL, hDC);/创建位图文件 fh=CreateFile(LPCWSTR)lpFileName, GENERIC_WRITE,0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);if (fh=INVALID_HANDLE_VALUE)return false;/ 设置位图文件头bmfHdr.bfType = 0x4D42; / BMdwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize+dwBmBitsSize; bmfHdr.bfSize = dwDIBSize;bmfHdr.bfReserved1 = 0;bmfHdr.bfReserved2 = 0;bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize;/ 写入位图文件头WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);/ 写入位图文件其余内容WriteFile(fh, (LPSTR)lpbi, sizeof(BITMAPINFOHEADER)+dwPaletteSize+dwBmBitsSize , &dwWritten, NULL); /清除 GlobalUnlock(hDib);GlobalFree(hDib);CloseHandle(fh);return true;4.bool SaveBitmapToFile(HBITMAP hBitmap, LPSTR lpFileName)/该方法更为简单,代码量少,但是使用前必须使用命名空间:using namespace ATL;否则“CImage”: 未声明的标识符。该方法在存图片时,根据传入的文件名决定保存格式,例如,(m_hBitmap由函数2取得,或者自行处理取得)SaveBitmapToFile(m_hBitmap,(LPSTR)_T(C:temp.bmp);/保存为bmpSaveBitmapToFile(m_

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论