C++ 捕获位图快速内存
这段代码正在以每秒1%到2%(总共6GB)的速度消耗我的RAM。 谁能告诉我怎么了?提前谢谢。我是新手,所以如果我听起来像个十足的白痴,我就是。我想尽快得到答复C++ 捕获位图快速内存,c++,bitmap,C++,Bitmap,这段代码正在以每秒1%到2%(总共6GB)的速度消耗我的RAM。 谁能告诉我怎么了?提前谢谢。我是新手,所以如果我听起来像个十足的白痴,我就是。我想尽快得到答复 #include <windows.h> #include <iostream> #include <stdio.h> using namespace std; /* Globals */ int ScreenX = 0; int S
#include <windows.h>
#include <iostream>
#include <stdio.h>
using namespace std;
/* Globals */
int ScreenX = 0;
int ScreenY = 0;
BYTE* ScreenData = 0;
void ScreenCap()
{
HDC hScreen = GetDC(GetDesktopWindow());
//hScreen2 = hScreen;
if (ScreenX == 0)
{
ScreenX = GetDeviceCaps(hScreen, HORZRES);
ScreenY = GetDeviceCaps(hScreen, VERTRES);
}
HDC hdcMem = CreateCompatibleDC (hScreen);
HBITMAP hBitmap = CreateCompatibleBitmap(hScreen, ScreenX, ScreenY);
HGDIOBJ hOld = SelectObject(hdcMem, hBitmap);
BitBlt(hdcMem, 0, 0, ScreenX, ScreenY, hScreen, 0, 0, SRCCOPY);
SelectObject(hdcMem, hOld);
BITMAPINFOHEADER bmi = {0};
bmi.biSize = sizeof(BITMAPINFOHEADER);
bmi.biPlanes = 1;
bmi.biBitCount = 32;
bmi.biWidth = ScreenX;
bmi.biHeight = -ScreenY;
bmi.biCompression = BI_RGB;
bmi.biSizeImage = 0;// 3 * ScreenX * ScreenY;
if(ScreenData)
free(ScreenData);
ScreenData = (BYTE*)malloc(4 * ScreenX * ScreenY);
GetDIBits(hdcMem, hBitmap, 0, ScreenY, ScreenData, (BITMAPINFO*)&bmi, DIB_RGB_COLORS);
ReleaseDC(GetDesktopWindow(),hScreen);
DeleteDC(hdcMem);
}
inline int PosB(int x, int y)
{
return ScreenData[4*((y*ScreenX)+x)];
}
inline int PosG(int x, int y)
{
return ScreenData[4*((y*ScreenX)+x)+1];
}
inline int PosR(int x, int y)
{
return ScreenData[4*((y*ScreenX)+x)+2];
}
bool ButtonPress(int Key)
{
bool button_pressed = false;
while(GetAsyncKeyState(Key))
button_pressed = true;
return button_pressed;
}
int main()
{
while (true)
{
ScreenCap();
/*for (int x = 1; x < ScreenX; x++)
{
for (int y = 1; y < ScreenY; y++)
{
int Red = PosR(x, y);
int Green = PosG(x, y);
int Blue = PosB(x, y);
if (Red == 22 && Green == 58 && Blue == 89)
{
cout << ">:D";
POINT pos;
GetCursorPos(&pos);
int DX = 683 - x;
int DY = 683 - y;
/*COLORREF col = GetPixel(hScreen2, DX - pos.x + 1, pos.y - DY + 1);
int red = GetRValue(col);
int blue = GetBValue(col);
int green = GetGValue(col);
if (red == 22 && green == 58 && blue == 89)
{
break;
}
//SetCursorPos(x + DX, y + DY);
SetCursorPos(DX - pos.x + 1, pos.y - DY + 1);
cout << DX - pos.x << ", " << pos.y - DY + 1 << endl;
break;
}
}
}*/
}
system("PAUSE");
return 0;
}
#包括
#包括
#包括
使用名称空间std;
/*全球的*/
int ScreenX=0;
int-ScreenY=0;
字节*屏幕数据=0;
无效屏幕盖()
{
HDC hsscreen=GetDC(GetDesktopWindow());
//hs屏幕2=hs屏幕;
如果(屏幕X==0)
{
ScreenX=GetDeviceCaps(hsScreen,HORZRES);
ScreenY=获取设备CAPS(hs屏幕,垂直);
}
HDC hdcMem=CreateCompatibleDC(hs屏幕);
HBITMAP HBITMAP=CreateCompatibleBitmap(hsscreen,ScreenX,ScreenY);
HGDIOBJ hOld=SelectObject(hdcMem、hBitmap);
BitBlt(hdcMem,0,0,ScreenX,ScreenY,hsscreen,0,0,srcopy);
选择对象(hdcMem,按住);
BitMapInfo标头bmi={0};
bmi.biSize=sizeof(BitMapInfo标头);
bmi.biPlanes=1;
bmi.biBitCount=32;
bmi.biWidth=ScreenX;
bmi.biHeight=-筛状;
bmi.biCompression=biu RGB;
bmi.biSizeImage=0;//3*ScreenX*ScreenY;
if(屏幕数据)
免费(屏幕数据);
ScreenData=(字节*)malloc(4*ScreenX*ScreenY);
GetDIBits(hdcMem、hBitmap、0、ScreenY、ScreenData(BITMAPINFO*)和bmi、DIB_RGB_颜色);
释放DC(GetDesktopWindow(),hs屏幕);
DeleteDC(hdcMem);
}
内联整数PosB(整数x,整数y)
{
返回屏幕数据[4*((y*ScreenX)+x)];
}
内联整数PosG(整数x,整数y)
{
返回屏幕数据[4*((y*ScreenX)+x)+1];
}
内联整数PosR(整数x,整数y)
{
返回屏幕数据[4*((y*ScreenX)+x)+2];
}
bool按钮按下(int键)
{
按下布尔按钮=错误;
while(GetAsyncKeyState(键))
按下按钮=真;
按下返回按钮;
}
int main()
{
while(true)
{
屏幕盖();
/*对于(int x=1;x 您是否可以继续创建新位图,而从不删除它们
比每次释放位图更好的方法是重用以前的位图,除非屏幕大小实际发生了更改。ScreenData
。不必要的重新分配是性能杀手
在销毁DC之前,您也没有选择原始对象,这是一个问题。那么我该如何删除它们呢?就像我说的,我是个白痴。我不想问,但这是我的最后一个问题(我希望)。你能发布一个修改后的版本吗?我希望要求不要太高。CreateCompatibleBitmap
的文档应该会指向DeleteObject
,这是位图删除功能。MSDN上没有示例吗?