|
为什么相同的代码相同的时间,win2008能截百余张图,win2019只能截30张?
- // ScreenCmd.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
- //
- #include <iostream>
- #include <windows.h>
- #include <atlstr.h>
- #include<ctime>
- HBITMAP Copybitmap(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("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 < 0)
- ny = 0;
- if (nx2 > 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;
- }
- BOOL SaveBmp(CString lpFileName, HBITMAP hBitmap)
- {
- 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("DISPLAY", NULL, NULL, NULL);
- iBits = GetDeviceCaps(hDC, BITSPIXEL) *
- GetDeviceCaps(hDC, PLANES);
- DeleteDC(hDC);
- iBits = 24;
- 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 = (1 << wBitCount)*sizeof(RGBQUAD);
- //设置位图信息头结构
- GetObject(hBitmap, sizeof(BITMAP), (void*)&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;
- //为位图内容分配内存
- 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(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; // "BM"
- dwDIBSize = 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;
- }
- int main()
- {
- LPRECT temprect;
- HBITMAP tempmap;
- temprect = new RECT();
- temprect->bottom = 1500;
- temprect->left = 0;
- temprect->right = 1200;
- temprect->top = 0;
- int i = 0;
- clock_t startTime, endTime;
- startTime = clock();
- while (true)
- {
- i++;
- tempmap = Copybitmap(temprect);
- char *test=new char;
- itoa(i, test, 10);
- const char *str = ".bmp";
- char *bmp = strcat(test, str);
-
- CString strs;
- strs.Format("%s", bmp);
- // std::cout << "第" << strs << "次!\n";
- SaveBmp(strs, tempmap);
- std::cout << "第" << test << "次!\n";
- endTime = clock();
- if ((endTime - startTime) / CLOCKS_PER_SEC==1)
- {
- break;
- }
- }
- //显示获取的屏幕
- delete temprect;
-
- }
复制代码 |
上一篇: 哪位有破解的百度网盘下一篇: [转贴]小技巧:MFC对话框动态类名
|