标签:c style class blog code java
VC将屏幕区域保存为图片,该代码为网上搜集整理。
1 int CDlldemoDlg::SaveBitmapToFile(HBITMAP hBitmap, LPSTR lpFileName) //hBitmap 为刚才的屏幕位图句柄 2 { //lpFileName 为位图文件名 3 WORD wBitCount; //位图中每个像素所占字节数 4 5 //定义调色板大小,位图中像素字节大小,位图文件大小,写入文件字节数 6 DWORD dwPaletteSize=0,dwBmBitsSize,dwDIBSize, dwWritten; 7 BITMAP Bitmap; //位图属性结构 8 BITMAPFILEHEADER bmfHdr; //位图文件头结构 9 BITMAPINFOHEADER bi; //位图信息头结构 10 HANDLE fh; //定义文件,分配内存句柄,调色板句柄 11 LPSTR lpbk,lpmem; 12 13 wBitCount = 32; 14 //设置位图信息头结构 15 GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap); 16 bi.biSize = sizeof(BITMAPINFOHEADER); 17 bi.biWidth = Bitmap.bmWidth; 18 bi.biHeight = Bitmap.bmHeight; //为负,正向的位图;为正,倒向的位图 19 bi.biPlanes = 1; 20 bi.biBitCount = wBitCount; 21 bi.biCompression = BI_RGB; 22 bi.biSizeImage=0; 23 bi.biXPelsPerMeter=0; 24 bi.biYPelsPerMeter=0; 25 bi.biClrUsed=0; 26 bi.biClrImportant=0; 27 dwBmBitsSize=((Bitmap.bmWidth*wBitCount+31)/32)*4*Bitmap.bmHeight; 28 29 //创建位图文件 30 fh = CreateFile(lpFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 31 FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL); 32 if (fh == INVALID_HANDLE_VALUE) 33 return FALSE; 34 //设置位图文件头 35 bmfHdr.bfType = 0x4D42; // "BM" 36 dwDIBSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwBmBitsSize; 37 bmfHdr.bfSize = dwDIBSize; 38 bmfHdr.bfReserved1 = 0; 39 bmfHdr.bfReserved2 = 0; 40 bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER)+(DWORD)sizeof(BITMAPINFOHEADER); 41 42 //写入位图文件头 43 WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER),&dwWritten, NULL); 44 //写入位图信息头 45 WriteFile(fh, (LPSTR)&bi,sizeof(BITMAPINFOHEADER),&dwWritten, NULL); 46 47 //获取位图阵列 48 lpmem=new char[dwBmBitsSize]; 49 lpbk=(LPSTR) new char[dwBmBitsSize]; 50 GetBitmapBits(hBitmap,dwBmBitsSize,lpmem);//正向的内存图象数据 51 52 //转化为倒向数据(仅在bmHeight为正时需要) 53 for(int i=0;i<Bitmap.bmHeight;i++) 54 { 55 memcpy(lpbk+Bitmap.bmWidth*i*4,lpmem+Bitmap.bmWidth*(Bitmap.bmHeight-i-1)*4,Bitmap.bmWidth*4); 56 } 57 //写位图数据 58 WriteFile(fh, lpbk,dwBmBitsSize,&dwWritten, NULL); 59 60 //清除 61 delete []lpbk; 62 delete []lpmem; 63 64 CloseHandle(fh); 65 return TRUE; 66 67 } 68 HBITMAP CDlldemoDlg::CopyScreenToBitmap(LPRECT lpRect) //lpRect 代表选定区域 69 { 70 HDC hScrDC,hMemDC; //屏幕和内存设备描述表 71 HBITMAP hBitmap,hOldBitmap;//位图句柄 72 int nX,nY,nX2,nY2; //选定区域坐标 73 int nWidth,nHeight; //位图宽度和高度 74 int xScrn,yScrn; //屏幕宽度和高度 75 76 //确保选定区域不为空矩形 77 if(IsRectEmpty(lpRect)) 78 return NULL; 79 80 //为屏幕创建设备描述表 81 hScrDC=CreateDC("DISPLAY", NULL, NULL, NULL); 82 //为屏幕设备描述表创建兼容的内存设备描述表 83 hMemDC=CreateCompatibleDC(hScrDC); //或者::CreateCompatibleDC(NULL) 84 85 //获得选定区域坐标 86 nX=lpRect->left; 87 nY=lpRect->top; 88 nX2=lpRect->right; 89 nY2=lpRect->bottom; 90 91 //获得屏幕宽度和高度 92 xScrn=GetDeviceCaps(hScrDC,HORZRES); 93 yScrn=GetDeviceCaps(hScrDC,VERTRES); 94 95 //确保选定区域是可见的 96 if (nX<0) 97 nX=0; 98 if (nY<0) 99 nY=0; 100 if (nX2>xScrn) 101 nX2=xScrn; 102 if (nY2>yScrn) 103 nY2=yScrn; 104 105 nWidth=nX2-nX; 106 nHeight=nY2-nY; 107 108 //创建一个与屏幕设备描述表兼容的位图 109 hBitmap=CreateCompatibleBitmap(hScrDC,nWidth,nHeight); 110 111 //把新位图选到内存设备描述表中 112 hOldBitmap=(HBITMAP)SelectObject(hMemDC,hBitmap); 113 114 //把屏幕设备描述表拷贝到内存设备描述表中 115 BitBlt(hMemDC,0,0,nWidth,nHeight,hScrDC,nX,nY,SRCCOPY); 116 117 //得到屏幕位图的句柄 118 hBitmap=(HBITMAP)SelectObject(hMemDC,hOldBitmap); 119 120 //清除 121 DeleteDC(hScrDC); 122 DeleteDC(hMemDC); 123 return hBitmap; //返回位图句柄 124 }
VC将屏幕区域保存为图片[转],布布扣,bubuko.com
标签:c style class blog code java
原文地址:http://www.cnblogs.com/zhouwenJS/p/3763100.html