c++ - 循环中的 C++ 窗口图像导致延迟
问题描述
我正在尝试抓取窗口的图像来抓取像素数据。以下代码段在循环内运行。似乎一切正常,但运行几分钟后,应用程序开始挂起。我的猜测是存在某种内存泄漏。我希望有人能指出我在这里做错了什么。
void ScreenShot(LPCSTR filename)
{
RECT DesktopParams;
GetWindowRect(hwnd, &DesktopParams);
DWORD Width = DesktopParams.right - DesktopParams.left;
DWORD Height = DesktopParams.bottom - DesktopParams.top;
DWORD FileSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + (sizeof(RGBTRIPLE) + 1 * (Width*Height * 4));
char *BmpFileData = (char*)GlobalAlloc(GMEM_FIXED, FileSize);
PBITMAPFILEHEADER BFileHeader = (PBITMAPFILEHEADER)BmpFileData;
PBITMAPINFOHEADER BInfoHeader = (PBITMAPINFOHEADER)&BmpFileData[sizeof(BITMAPFILEHEADER)];
BFileHeader->bfType = 0x4D42; // BM
BFileHeader->bfSize = sizeof(BITMAPFILEHEADER);
BFileHeader->bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
BInfoHeader->biSize = sizeof(BITMAPINFOHEADER);
BInfoHeader->biPlanes = 1;
BInfoHeader->biBitCount = 24;
BInfoHeader->biCompression = BI_RGB;
BInfoHeader->biHeight = Height;
BInfoHeader->biWidth = Width;
RGBTRIPLE *Image = (RGBTRIPLE*)&BmpFileData[sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)];
RGBTRIPLE color;
HDC CaptureDC = CreateCompatibleDC(DevC);
HBITMAP CaptureBitmap = CreateCompatibleBitmap(DevC, Width, Height);
SelectObject(CaptureDC, CaptureBitmap);
BitBlt(CaptureDC, 0, 0, Width, Height, DevC, 0, 0, SRCCOPY | CAPTUREBLT);
GetDIBits(CaptureDC, CaptureBitmap, 0, Height, Image, (LPBITMAPINFO)BInfoHeader, DIB_RGB_COLORS);
RGBTRIPLE *pixel = get_pixel(BInfoHeader, Image, 100, 100);
cout << (int)pixel->rgbtRed << ", " << (int)pixel->rgbtBlue << "," << (int)pixel->rgbtGreen << endl;
GlobalFree(BmpFileData);
}
经过更多的测试后,我意识到如果我注释掉 get_pixel,lage 就会消失。
RGBTRIPLE * get_pixel(PBITMAPINFOHEADER BInfoHeader, RGBTRIPLE *Image, int x, int y)
{
return &Image[(BInfoHeader->biHeight - 1 - y)*BInfoHeader->biWidth + x];
}
解决方案
推荐阅读
- react-native - 通过调度动作改变状态,但不调用 mapStateToProps
- node.js - 如何将我从数据库中获得的数据从模型返回到控制器
- javascript - 表单标签中的按钮不会提交或响应 Javascript/Jquery
- node.js - 如何防止将架构字段插入子文档?
- python - 无法修改字典中的页码
- jenkins - 如何创建一个带有时间戳的文件夹并将构建 ID 作为文件夹名称并将一些文件复制到该文件夹中?
- java - 如何使用apache pdfbox在pdf中打印html文本
- installation - SQL Server 2017 Express 静默安装
- javascript - Javascript - 访问带有嵌入标签的页面的内容
- bash - 从 shell 可执行文件打开并显示 chrome