GetDIBits und Schleife durch Pixel mit X, Y

7

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.

    
guitar- 10.09.2010, 21:17
quelle

5 Antworten

11

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.)

GetDIBits-Referenz @ MSDN

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 von BITMAPINFOHEADER BI_RGB ist, ist das bmiColors Mitglied von BITMAPINFO NULL . Jedes DWORD in dem Bitmap-Array repräsentiert die relativen Intensitäten von Blau, Grün bzw. Rot für ein Pixel. Das High-Byte in jedem DWORD 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%     
dyp 23.05.2017, 11:53
quelle
9

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%     
Jim Mischel 10.09.2010 21:41
quelle
2

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)

    
James 10.09.2010 21:25
quelle
2

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

    
Goz 10.09.2010 21:41
quelle
0

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.

    
Крутой Инфо 02.11.2014 16:21
quelle

Tags und Links