VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 2347|回复: 2

[讨论] 为什么相同的代码相同的时间,win2008能截百余张图,win2019只能截30张?

[复制链接]
23_avatar_middle
最佳答案
0 
online_vip 发表于 2020-4-4 08:56:14 | 显示全部楼层 |阅读模式
为什么相同的代码相同的时间,win2008能截百余张图,win2019只能截30张?



  1. // ScreenCmd.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
  2. //

  3. #include <iostream>
  4. #include <windows.h>
  5. #include <atlstr.h>
  6. #include<ctime>
  7. HBITMAP Copybitmap(LPRECT lprect)
  8. {
  9.         HDC hscrdc, hmemdc;// 屏幕和内存设备描述表
  10.         HBITMAP hbitmap, holdbitmap;// 位图句柄
  11.         int nx, ny, nx2, ny2;// 选定区域坐标
  12.         int nwidth, nheight;// 位图宽度和高度
  13.         int xscrn, yscrn;// 屏幕分辨率
  14.         // 确保选定区域不为空矩形
  15.         if (IsRectEmpty(lprect))
  16.                 return NULL;
  17.         //为屏幕创建设备描述表
  18.         hscrdc = CreateDC("display", NULL, NULL, NULL);
  19.         //为屏幕设备描述表创建兼容的内存设备描述表
  20.         hmemdc = CreateCompatibleDC(hscrdc);
  21.         // 获得选定区域坐标
  22.         nx = lprect->left;
  23.         ny = lprect->top;
  24.         nx2 = lprect->right;
  25.         ny2 = lprect->bottom;
  26.         // 获得屏幕分辨率
  27.         xscrn = GetDeviceCaps(hscrdc, HORZRES);
  28.         yscrn = GetDeviceCaps(hscrdc, VERTRES);
  29.         //确保选定区域是可见的
  30.         if (nx < 0)
  31.                 nx = 0;
  32.         if (ny < 0)
  33.                 ny = 0;
  34.         if (nx2 > xscrn)
  35.                 nx2 = xscrn;
  36.         if (ny2 > yscrn)
  37.                 ny2 = yscrn;

  38.         nwidth = nx2 - nx;
  39.         nheight = ny2 - ny;

  40.         // 创建一个与屏幕设备描述表兼容的位图
  41.         hbitmap = CreateCompatibleBitmap(hscrdc, nwidth, nheight);

  42.         // 把新位图选到内存设备描述表中
  43.         holdbitmap = (HBITMAP)SelectObject(hmemdc, hbitmap);
  44.         // 把屏幕设备描述表拷贝到内存设备描述表中
  45.         BitBlt(hmemdc, 0, 0, nwidth, nheight, hscrdc, nx, ny, SRCCOPY);
  46.         //得到屏幕位图的句柄
  47.         hbitmap = (HBITMAP)SelectObject(hmemdc, holdbitmap);

  48.         //清除
  49.         DeleteDC(hscrdc);
  50.         DeleteDC(hmemdc);

  51.         // 返回位图句柄
  52.         return hbitmap;
  53. }
  54. BOOL SaveBmp(CString lpFileName, HBITMAP hBitmap)
  55. {
  56.         HDC hDC;
  57.         //设备描述表
  58.         int iBits;
  59.         //当前显示分辨率下每个像素所占字节数
  60.         WORD wBitCount;
  61.         //位图中每个像素所占字节数
  62.         //定义调色板大小, 位图中像素字节大小 , 位图文件大小 , 写入文件字节数
  63.         DWORD dwPaletteSize = 0, dwBmBitsSize, dwDIBSize, dwWritten;
  64.         BITMAP Bitmap;
  65.         //位图属性结构
  66.         BITMAPFILEHEADER bmfHdr;
  67.         //位图文件头结构
  68.         BITMAPINFOHEADER bi;
  69.         //位图信息头结构
  70.         LPBITMAPINFOHEADER lpbi;
  71.         //指向位图信息头结构
  72.         HANDLE fh, hDib, hPal;
  73.         HPALETTE hOldPal = NULL;
  74.         //定义文件,分配内存句柄,调色板句柄
  75.         //计算位图文件每个像素所占字节数
  76.         hDC = CreateDC("DISPLAY", NULL, NULL, NULL);
  77.         iBits = GetDeviceCaps(hDC, BITSPIXEL) *
  78.                 GetDeviceCaps(hDC, PLANES);
  79.         DeleteDC(hDC);
  80.         iBits = 24;
  81.         if (iBits <= 1)
  82.                 wBitCount = 1;
  83.         else if (iBits <= 4)
  84.                 wBitCount = 4;
  85.         else if (iBits <= 8)
  86.                 wBitCount = 8;
  87.         else if (iBits <= 24)
  88.                 wBitCount = 24;
  89.         else
  90.                 wBitCount = 32;
  91.         //计算调色板大小
  92.         if (wBitCount <= 8)
  93.                 dwPaletteSize = (1 << wBitCount)*sizeof(RGBQUAD);
  94.         //设置位图信息头结构
  95.         GetObject(hBitmap, sizeof(BITMAP), (void*)&Bitmap);
  96.         bi.biSize = sizeof(BITMAPINFOHEADER);
  97.         bi.biWidth = Bitmap.bmWidth;
  98.         bi.biHeight = Bitmap.bmHeight;
  99.         bi.biPlanes = 1;
  100.         bi.biBitCount = wBitCount;
  101.         bi.biCompression = BI_RGB;
  102.         bi.biSizeImage = 0;
  103.         bi.biXPelsPerMeter = 0;
  104.         bi.biYPelsPerMeter = 0;
  105.         bi.biClrUsed = 0;
  106.         bi.biClrImportant = 0;
  107.         dwBmBitsSize = ((Bitmap.bmWidth*wBitCount + 31) / 32) * 4 * Bitmap.bmHeight;
  108.         //为位图内容分配内存
  109.         hDib = GlobalAlloc(GHND, dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER));
  110.         lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
  111.         *lpbi = bi;
  112.         // 处理调色板
  113.         hPal = GetStockObject(DEFAULT_PALETTE);
  114.         if (hPal)
  115.         {
  116.                 hDC = ::GetDC(NULL);
  117.                 hOldPal = SelectPalette(hDC, (HPALETTE)hPal, FALSE);
  118.                 RealizePalette(hDC);
  119.         }
  120.         // 获取该调色板下新的像素值
  121.         GetDIBits(hDC, hBitmap, 0, (UINT)Bitmap.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER)+dwPaletteSize, (BITMAPINFO *)lpbi, DIB_RGB_COLORS);
  122.         //恢复调色板
  123.         if (hOldPal)
  124.         {
  125.                 SelectPalette(hDC, hOldPal, TRUE);
  126.                 RealizePalette(hDC);
  127.                 ::ReleaseDC(NULL, hDC);
  128.         }
  129.         //创建位图文件
  130.         fh = CreateFile(lpFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
  131.         if (fh == INVALID_HANDLE_VALUE)
  132.                 return FALSE;
  133.         // 设置位图文件头
  134.         bmfHdr.bfType = 0x4D42; // "BM"
  135.         dwDIBSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwPaletteSize + dwBmBitsSize;
  136.         bmfHdr.bfSize = dwDIBSize;
  137.         bmfHdr.bfReserved1 = 0;
  138.         bmfHdr.bfReserved2 = 0;
  139.         bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER)+(DWORD)sizeof(BITMAPINFOHEADER)+dwPaletteSize;
  140.         // 写入位图文件头
  141.         WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
  142.         // 写入位图文件其余内容
  143.         WriteFile(fh, (LPSTR)lpbi, sizeof(BITMAPINFOHEADER)+dwPaletteSize + dwBmBitsSize, &dwWritten, NULL);
  144.         //清除
  145.         GlobalUnlock(hDib);
  146.         GlobalFree(hDib);
  147.         CloseHandle(fh);
  148.         return TRUE;

  149. }

  150. int main()
  151. {
  152.         LPRECT temprect;
  153.         HBITMAP tempmap;

  154.         temprect = new RECT();
  155.         temprect->bottom = 1500;
  156.         temprect->left = 0;
  157.         temprect->right = 1200;
  158.         temprect->top = 0;

  159.         int i = 0;
  160.         clock_t startTime, endTime;
  161.         startTime = clock();
  162.         while (true)
  163.         {
  164.                 i++;
  165.                 tempmap = Copybitmap(temprect);
  166.                 char *test=new char;
  167.                 itoa(i, test, 10);
  168.                 const char *str = ".bmp";
  169.                 char *bmp = strcat(test, str);
  170.                
  171.                 CString strs;
  172.                 strs.Format("%s", bmp);

  173.         //        std::cout << "第" << strs << "次!\n";
  174.                 SaveBmp(strs, tempmap);
  175.                 std::cout << "第" << test << "次!\n";
  176.                 endTime = clock();
  177.                 if ((endTime - startTime) / CLOCKS_PER_SEC==1)
  178.                 {
  179.                         break;
  180.                 }
  181.         }

  182.         //显示获取的屏幕



  183.         delete temprect;
  184.    
  185. }
复制代码




上一篇:哪位有破解的百度网盘
下一篇:[转贴]小技巧:MFC对话框动态类名
51_avatar_middle
最佳答案
90 
online_admins 发表于 2020-4-4 14:01:26 | 显示全部楼层
这个得具体调试调试看看了,按理说不应该啊。。。2008 或者 2019 是 Server 版本的系统吗?
23_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-4-4 14:31:46 | 显示全部楼层
Syc 发表于 2020-4-4 14:01
这个得具体调试调试看看了,按理说不应该啊。。。2008 或者 2019 是 Server 版本的系统吗?

都是server

win10也是一样。

dxgi截图也是一样
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号-4 )|网站地图wx_jqr

GMT+8, 2023-6-4 21:45

Powered by CcTry.CoM

© 2009-2021 cctry.com

快速回复 返回顶部 返回列表