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.
-
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
PrintWindowan.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] blauer 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