捕获位图快速占用RAM

时间:2013-12-15 00:19:38

标签: c++ bitmap

这段代码以每秒1%到2%的速度占用我的RAM(总共6 GB)。 谁能告诉我什么是错的?提前致谢。我是新手,所以如果我听起来像个完全白痴,我就是。我想快速回答。

        #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;
    }

1 个答案:

答案 0 :(得分:2)

您不断创建新的位图,永远不会删除它们。

除非屏幕尺寸实际发生变化,否则每次释放它们都会比重复使用前一个位图更好。同上ScreenData。不必要地重新分配是性能杀手。

在破坏DC之前,您也没有选择原始对象,这是一个问题。