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 }
时间: 2024-10-22 16:13:04