Ich nehme einen Teil des Bildschirms und scanne durch die Pixel für einen bestimmten Farbbereich.
Ich habe mir MSDN's Capturing a Image Beispiel angeschaut weiß, wie man die Funktionen benutzt.
Ich kann die Bits in ein Array bringen, aber ich bin mir nicht sicher, wie ich es so machen soll, dass ich es wie ein Bild durchlaufen kann. Ein Pseudo-Beispiel (von dem ich sicher bin, dass es weit weg ist):
%Vor%Das ist im Grunde, was ich tun möchte. Wenn also Rot, Blau und Grün eine bestimmte Farbe haben, weiß ich, um welche Koordinate es sich im Bild (x, y) handelt.
Ich weiß einfach nicht, wie man GetDIBits auf diese Weise benutzt und wie man das Array entsprechend einrichtet, um dies zu erreichen.
Abgesehen von den bereits gegebenen guten Antworten, ist hier ein Beispiel für wie , um eine einfache Array-Struktur zum Laufen zu bekommen. (Sie können z. B. den Goz-Code für die Iteration verwenden.)
Sie müssen DIB_RGB_COLORS
als Flag für uUsage
auswählen und die BITMAPINFO
Struktur und die BITMAPINFOHEADER
Struktur enthält es. Wenn Sie biClrUsed
und biClrImportant
auf Null setzen, gibt es eine Farbtabelle "nein", so dass Sie die Pixel der Bitmap lesen können, die Sie aus GetDIBits
als Folge von RGB-Werten erhalten. Die Verwendung von 32
als Bitzahl ( biBitCount
) richtet die Datenstruktur nach MSDN ein:
Die Bitmap hat maximal 2 ^ 32 Farben. Wenn das
biCompression
Mitglied vonBITMAPINFOHEADER
BI_RGB
ist, ist dasbmiColors
Mitglied vonBITMAPINFO
NULL
. JedesDWORD
in dem Bitmap-Array repräsentiert die relativen Intensitäten von Blau, Grün bzw. Rot für ein Pixel. Das High-Byte in jedemDWORD
wird nicht verwendet.
Da eine MS LONG
genau 32 Bit lang ist (die Größe einer DWORD
), müssen Sie nicht auf Padding achten (wie in Abschnitt Anmerkungen ).
Code:
%Vor% GetDIBits
gibt ein eindimensionales Array von Werten zurück. Für eine Bitmap, die M Pixel breit, N Pixel hoch ist und 24-Bit-Farbe verwendet, sind die ersten (M * 3) Bytes die erste Reihe von Pixeln. Darauf können einige Füllbytes folgen. Es hängt vom BITMAPINFOHEADER ab. In der Regel wird die Breite durch Auffüllen auf ein Vielfaches von 4 Byte erhöht. Wenn Ihre Bitmap also 33 Pixel breit ist, wird es tatsächlich (36 * 3) Bytes pro Zeile geben.
Dieses "Pixel plus Padding" wird "Schritt" genannt. Für RGB-Bitmaps können Sie Schritt mit: stride = (biWidth * (biBitCount / 8) + 3) & ~3
berechnen, wobei biWidth
und biBitCount
vom BITMAPINFOHEADER übernommen werden.
Ich bin mir nicht sicher, wie Sie das Array durchqueren wollen. Wenn Sie Pixel für Pixel von oben links nach unten rechts gehen möchten (vorausgesetzt, es handelt sich um eine Top-Down-Bitmap):
%Vor%Es ist nicht so einfach. Ihr Algorithmus hängt von der Farbtiefe des Bildes ab. Wenn es 256 oder weniger ist, haben Sie keine Pixelfarben, sondern eine Farbpalette. 16-Bit-Pixel können RGB555 oder RGB565 sein, 24-Bit-Bilder RGB888 und 32-Bit-Bilder RGBA oder ARGB. Du wirst den BITMAPINFOHEADER brauchen, um es herauszufinden.
Sobald Sie herausgefunden haben, sind die Pixeldaten nur ein Array der Größe width * height * (BitsPerPixel / 8)
In dem Link, den Sie veröffentlichen, erstellen Sie eine 32-Bit-Bitmap, also nehme ich an, dass Sie von einer 32-Bit-Bitmap lesen (Diese Annahme ist möglicherweise falsch).
Daher sollte das Ändern der folgenden Schleife funktionieren:
%Vor%Dinge im Hinterkopf:
1.Arrays sind 0 in C / C ++ - basiert
2. Sie haben jedes Mal 3 Pixel horizontal und vertikal versetzt. Was bedeutet, dass Sie nicht jedes Pixel besuchen.
3. Eine Bitmap ist normalerweise so organisiert, dass es "Höhen" von "Breite" Pixeln gibt. Daher sollten Sie jedes Pixel in einem Bereich durchlaufen und dann zum nächsten Bereich wechseln.
4. Wie bereits erwähnt, achten Sie darauf, dass Sie die Pixel richtig lesen. im 16-Bit-Modus ist es komplexer
Einige Überraschungen von MSDN:
Die Tabelle besteht aus einem Array von RGBQUAD-Datenstrukturen. (Der Tisch für das BITMAPCOREINFO-Format wird mit den RGBTRIPLE-Daten erstellt Struktur.) Rote, grüne und blaue Bytes sind in umgekehrter Reihenfolge (rot Swaps Position mit blau) aus der Windows-Konvention.
Farben befinden sich also nach GetDIBits () in der BGR-Reihenfolge im Speicher.