2016-04-13 5 views
0

Getpixel() ist zu langsam, so versuche ich, Bitmap zu verwenden, um die RGB-Werte in einem Zeiger schnell auf die RGB-Werte zugreifen, aber es scheint Entweder habe ich bei den Bitmap-Operationen versagt oder den Zeiger nicht richtig gefunden!C++ Um GetPixel() zu ersetzen, Bitmap + Zeiger zu beschleunigen, um Dinge zu beschleunigen

Ich verwende Pixelcolor() zu vergleichen, damit ich weiß, ich habe es richtig, wenn die zurückgegebenen RGB-Werte miteinander übereinstimmen.

Kann mir jemand helfen?

Hier ist mein Code:

#include <iostream> 
#include <Windows.h> 
using namespace std; 

void cout_colour(); 
void get_pixel(); 

void main() 
{ 
    cout_colour(); 
    get_pixel(); 
} 

void cout_colour() 
{ 
    HDC hdc, hdcTemp; 
    RECT rect; 
    BYTE* bitPointer; 

    int red = 0; 
    int green = 0; 
    int blue = 0; 

    hdc = GetDC(GetDesktopWindow()); 
    GetWindowRect(GetDesktopWindow(), &rect); 

    int MAX_WIDTH = rect.right; 
    int MAX_HEIGHT = rect.bottom; 

    cout << "MAX_WIDTH" << MAX_WIDTH << endl; 
    cout << "MAX_HEIGHT" << MAX_HEIGHT << endl; 

    hdcTemp = CreateCompatibleDC(hdc); 

    BITMAPINFO bitmap; 
    bitmap.bmiHeader.biSize = sizeof(bitmap.bmiHeader); 
    bitmap.bmiHeader.biWidth = MAX_WIDTH; 
    bitmap.bmiHeader.biHeight = MAX_HEIGHT; 
    bitmap.bmiHeader.biPlanes = 1; 
    bitmap.bmiHeader.biBitCount = 32; 
    bitmap.bmiHeader.biCompression = BI_RGB; 
    bitmap.bmiHeader.biSizeImage = 0; 
    bitmap.bmiHeader.biClrUsed = 0; 
    bitmap.bmiHeader.biClrImportant = 0; 


    HBITMAP hBitmap2 = CreateDIBSection(hdcTemp, &bitmap, DIB_RGB_COLORS, (void**)(&bitPointer), NULL, NULL); 
    SelectObject(hdcTemp, hBitmap2); 
    BitBlt(hdcTemp, 0, 0, MAX_WIDTH, MAX_HEIGHT, hdc, 0, 0, SRCCOPY); 


    int i = 1; 

    int x = 1; 
    int y = 1; 
    SetCursorPos(x, y); 

    red = (int)bitPointer[i]; 
    green = (int)bitPointer[i + 1]; 
    blue = (int)bitPointer[i + 2]; 

    cout << red << " " << green << " " << blue << endl; 

    DeleteDC(hdc); 
} 

void get_pixel() 
{ 
    int x = 1; 
    int y = 1; 
    COLORREF hex_color; 
    int red; 
    int green; 
    int blue; 
    HDC dc = GetDC(GetDesktopWindow()); 

    hex_color = GetPixel(dc, x, y); 
    red = GetRValue(hex_color); 
    green = GetGValue(hex_color); 
    blue = GetBValue(hex_color); 

    cout << "Super Slow RGB cout!" << endl; 
    cout << red << " " << green << " " << blue << endl; 
} 

Antwort

0

Du bitPointer als Zeiger auf ein Array von BYTE Werte zu deklarieren. Sie führen also eine 8-Bit-Indexierung durch, wenn Sie ein Pixel aus dem Array holen. Sie erstellen jedoch eine 32-Bit-DIB, was bedeutet, dass die Pixel 32-Bit und nicht 8-Bit sind. Sie müssen stattdessen bitPointer als RGBQUAD* deklarieren.

Sie müssen auch die DIB-Breite berücksichtigen, wenn Sie auf ein Pixel in der 2. oder späteren Zeile indexieren.

Sie müssen auch berücksichtigen, dass Sie eine Bottom-up-DIB anstelle einer Top-down-DIB erstellen. Das hat Auswirkungen darauf, wie die Pixeldaten im Speicher abgelegt werden.

GetPixel() behandelt alle diese Details für Sie, aber da Sie auf die Pixel direkt zugreifen möchten, müssen Sie alles manuell tun.

Außerdem geben Sie die Objekte HDC und HBITMAP nicht korrekt frei.

etwas mehr wie das Versuchen Sie stattdessen:

#include <iostream> 
#include <Windows.h> 

using namespace std; 

void cout_colour(int x, int y) 
{ 
    HWND hWnd = GetDesktopWindow(); 
    HDC hdc = GetDC(hWnd); 

    RECT rect; 
    GetWindowRect(hWnd, &rect); 

    int MAX_WIDTH = rect.right - rect.left; 
    int MAX_HEIGHT = rect.bottom - rect.top; 

    cout << "MAX_WIDTH " << MAX_WIDTH << " MAX_HEIGHT " << MAX_HEIGHT << endl; 

    HDC hdcTemp = CreateCompatibleDC(hdc); 

    BITMAPINFO bitmap; 
    bitmap.bmiHeader.biSize = sizeof(bitmap.bmiHeader); 
    bitmap.bmiHeader.biWidth = MAX_WIDTH; 
    bitmap.bmiHeader.biHeight = -MAX_HEIGHT; 
    bitmap.bmiHeader.biPlanes = 1; 
    bitmap.bmiHeader.biBitCount = 32; 
    bitmap.bmiHeader.biCompression = BI_RGB; 
    bitmap.bmiHeader.biSizeImage = 0; 
    bitmap.bmiHeader.biClrUsed = 0; 
    bitmap.bmiHeader.biClrImportant = 0; 

    LPRGBQUAD bitPointer; 
    HBITMAP hBitmap2 = CreateDIBSection(hdcTemp, &bitmap, DIB_RGB_COLORS, (void**)&bitPointer, 0, 0); 

    HBITMAP hbmpOld = (HBITMAP) SelectObject(hdcTemp, hBitmap2); 
    BitBlt(hdcTemp, 0, 0, MAX_WIDTH, MAX_HEIGHT, hdc, 0, 0, SRCCOPY); 

    LPRGBQUAD hex_color = &bitPointer[(MAX_WIDTH*y)+x]; 
    int red = hex_color->rgbRed; 
    int green = hex_color->rgbGreen; 
    int blue = hex_color->rgbBlue; 

    cout << red << " " << green << " " << blue << endl; 

    SelectObject(hdcTemp, hbmpOld); 
    DeleteObject(hBitmap2); 
    DeleteDC(hdcTemp); 

    ReleaseDC(hWnd, hdc); 
} 

void get_pixel(int x, int y) 
{ 
    HWND hWnd = GetDesktopWindow(); 
    HDC hdc = GetDC(wnd); 

    COLORREF hex_color = GetPixel(hdc, x, y); 
    int red = GetRValue(hex_color); 
    int green = GetGValue(hex_color); 
    int blue = GetBValue(hex_color); 

    cout << "Super Slow RGB cout!" << endl; 
    cout << red << " " << green < " " << blue << endl; 

    ReleaseDC(hWnd, hdc); 
} 

int main() 
{ 
    cout_colour(1, 1); 
    get_pixel(1, 1); 
    return 0; 
} 
Verwandte Themen