Bildschirm Pixel Suche



  • moin moin,
    hab dieses Script hier geschrieben und finde den fehler nicht why es mir bei den farbwerten immer nur NULL ausgibt.

    Hat vlt. jmd. ne ahnung woran es liegt?

    #include <windows.h> 
    #include <iostream> 
    
    using namespace std; 
    
    int main() 
    { 
    	HWND capture = GetDesktopWindow(); 
    	if(!IsWindow(capture)) return 1; 
    	RECT rect;
    	GetWindowRect(capture, &rect); 
    
    	size_t dx = rect.right - rect.left; 
    	size_t dy = rect.bottom - rect.top; 
    
    	BITMAPINFO info; 
    	info.bmiHeader.biSize          = sizeof(BITMAPINFOHEADER); 
    	info.bmiHeader.biWidth         = dx; 
    	info.bmiHeader.biHeight        = dy; 
    	info.bmiHeader.biPlanes        = 1; 
    	info.bmiHeader.biBitCount      = 32; //24 würde weniger Speicher brauchen aber das auslesen der Farbinformationen etwas komplizierter machen. 
    	info.bmiHeader.biCompression   = BI_RGB; 
    	info.bmiHeader.biSizeImage     = 0; 
    	info.bmiHeader.biXPelsPerMeter = 0; 
    	info.bmiHeader.biYPelsPerMeter = 0; 
    	info.bmiHeader.biClrUsed       = 0; 
    	info.bmiHeader.biClrImportant  = 0; 
    
    	HBITMAP bitmap = 0; 
    	BYTE*   memory = 0; 
    
    	HDC device = GetDC(capture); 
    	bitmap = CreateDIBSection(device, &info, DIB_RGB_COLORS, (void**)&memory, 0, 0); 
    	ReleaseDC(capture, device); 
    	if(!bitmap || !memory) return 1; 
    
    	int tbytes = dx * dy * info.bmiHeader.biBitCount / 8; // (((24*dx + 31) & (~31))/8)*dy; falls du biBitCount oben auf 24 gesetzt hast 
    
    	short rot,gruen,blau;
    	for( int i = 0; i < tbytes; i+=4 ) 
    	{ 
    		rot = memory[i+1]; //rot 
    		gruen = memory[i+2]; //grün 
    		blau = memory[i+3]; //blau
    		cout << i << " " << "R" << rot << " " << "G" << gruen << " " << "B" << blau << endl; 
    	}
    
    	DeleteObject(bitmap); 
    	bitmap = 0; 
    	memory = 0;
    }
    

    mfg N4n3x



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


  • Mod

    Du hast eine DIB erzeugt. Aber da ist nichts drin.
    Du unterliegst einem Irrtum wenn Du denkst, dass das Erzeugen einer DIB den aktuellen Bildschirm Inhalt kopiert.

    Schau Dir mal das Sample an, vielleicht verstehst Du dann wie man mit DIBs arbeitet:
    http://www.codeproject.com/KB/graphics/rplcolor.aspx



  • OK thx, 😃
    hoffe ich habs jetzt richtig verstanden das createdibsection nur den speicherplatz reserviert.
    Jetzt müsst ich also den Screen in die dib laden.
    Ich denke es geht mit SetDIBits nun klappt es leider nicht bei mir. 😡
    außerdem wäre es mit diesem Befehl sehr umständlich.
    Gibs ne andere möglichkeit?.

    mfg N4n3x



  • Wenn du den Inhalt eines bestimmten Fensters speichern möchtest, schau dir einmal PrintWindow an.

    Wenn du allerdings das speichern möchtest, was aktuell auf dem Monitor zu sehen ist, geht's auch sehr einfach so:

    HDC hdcScreen = GetDC(capture);
    HDC hdc = CreateCompatibleDC(hdcScreen);
    // Dibsection erzeugen
    HGDIOBJ hbOld = SelectObject(hdc, _HANDLE_AUF_DIE_DIBSECTION_);
    BitBlt(hdc,0,0,_BREITE_,_HOEHE_,hdcScreen,0,0,SRCCOPY);
    SelectObject(hdc, hbOld);
    DeleteDC(hdc);
    ReleaseDC(NULL, hdcScreen);
    


  • Ok WOW Thx, 👍

    #include <windows.h> 
    #include <iostream> 
    
    using namespace std; 
    
    int main() 
    { 
        RECT rect;
    	HWND capture = GetDesktopWindow();
        GetWindowRect(capture, &rect); 
    
    	HDC hdcScreen = GetDc(capture); 
    	HDC hdc = CreateCompatibleDC(hdcScreen);
    
        size_t dx = rect.right - rect.left; 
        size_t dy = rect.bottom - rect.top; 
    
        BITMAPINFO info; 
        info.bmiHeader.biSize          = sizeof(BITMAPINFOHEADER); 
        info.bmiHeader.biWidth         = dx; 
        info.bmiHeader.biHeight        = dy; 
        info.bmiHeader.biPlanes        = 1; 
        info.bmiHeader.biBitCount      = 32; //24 würde weniger Speicher brauchen aber das auslesen der Farbinformationen etwas komplizierter machen. 
        info.bmiHeader.biCompression   = BI_RGB; 
        info.bmiHeader.biSizeImage     = 0; 
        info.bmiHeader.biXPelsPerMeter = 0; 
        info.bmiHeader.biYPelsPerMeter = 0; 
        info.bmiHeader.biClrUsed       = 0; 
        info.bmiHeader.biClrImportant  = 0; 
    
        HBITMAP bitmap = 0; 
        BYTE*   memory = 0; 
    
        HDC device = GetDC(capture); 
        bitmap = CreateDIBSection(device, &info, DIB_RGB_COLORS, (void**)&memory, 0, 0); 
        ReleaseDC(capture, device);
    	HGDIOBJ hbOld = SelectObject(hdc, bitmap); 
    BitBlt(hdc,0,0,dx,dy,hdcScreen,0,0,SRCCOPY); 
    SelectObject(hdc, hbOld);
        if(!bitmap || !memory) return 1; 
    
        int tbytes = dx * dy * info.bmiHeader.biBitCount / 8; // (((24*dx + 31) & (~31))/8)*dy; falls du biBitCount oben auf 24 gesetzt hast 
    
        short rot,gruen,blau,ggg; 
        for( int i = 0; i < tbytes; i++ ) 
        { 
            rot = memory[++i]; //rot 
            gruen = memory[++i]; //grün 
            blau = memory[++i]; //blau
            cout << rot << " " << gruen << " " << blau << endl;
        }
    
    	cin.get();
        DeleteObject(bitmap); 
        bitmap = 0; 
        memory = 0; 
    }
    

    Also werte kriege ich angezeigt,aber es scheinen nicht die richtigen zu sein.
    memory[0] wäre ja Tranzparenz vom Pixel 0,0
    memory[1] rot
    memory[2] grün
    memory[3] blau

    er gibt mir rot 15,grün 15,und blau 255 aus aber der Pixel 0,0 ist weiß mimt 255,255,255.
    Wenn ich meinen Bildschirm nach den ausgegebenen Farben durchsuche werden sie nicht gefunden. 😞
    Wodran könnte das liegen, wird das bild spiegelverkehrt in die dib geladen?

    mfg n4n3x



  • Ja, das Bild steht immer auf dem Kopf (falls info.bmiHeader.biHeight positiv ist) und das interne Format ist BGRA.
    Windows-Bitmaps sind little-endian formatiert, daher gilt 0xaarrggbb -> 0xbb, 0xgg, 0xrr, 0xaa
    Du kannst deine Ergebnisse mit der API GetPixel() und den Makros GetRValue(), GetGValue() GetBValue() zwecks Debugging mal vergleichen 🙂

    lg, XOR


Anmelden zum Antworten