GetDIBits und Schleife über die Pixel mit X -, Y -
Ich packte einen Teil des Bildschirms und Scannen durch die Pixel einer bestimmten Farbe Palette.
Schaute ich MSDN-das Erfassen eines Abbilds Beispiel und wissen, wie Sie die Funktionen nutzen.
Bekomme ich die bits in ein array, aber ich bin mir nicht sicher, wie es zu tun in einer Weise, die ich Durchlaufen und es als würde ich ein Bild. Ein pseudo-Beispiel (dessen bin ich mir sicher, ist Weg):
for ( x = 1; x <= Image.Width; x += 3 )
{
for ( y = 1; y <= Image.Height; y += 3 )
{
red = lpPixels[x];
green = lpPixels[x + 1];
blue = lpPixels[x + 2];
}
}
Ist im Grunde, was ich tun will, also wenn rot, blau und grün ist eine bestimmte Farbe, ich werde wissen, was zu koordinieren ist es bei (x, y) im Bild.
Ich weiß nur nicht, wie zu verwenden GetDIBits in einer solchen Art und Weise, und wie, um das setup das array entsprechend in der Lage sein, dies zu erreichen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Abgesehen von den guten Antworten, die bereits gegeben wurde, hier ein Beispiel von wie, um eine einfache array-Struktur den Fuß auf. (Sie können z.B. Goz' code für die iteration.)
GetDIBits Referenz @ MSDN
Wählen Sie
DIB_RGB_COLORS
als flag füruUsage
und einrichten derBITMAPINFO
- Struktur und dieBITMAPINFOHEADER
- Struktur es enthält. Wenn SiebiClrUsed
undbiClrImportant
null, es gibt "keine" Farbe-Tabelle, so dass Sie können Lesen Sie die Pixel der bitmap erhalten Sie vonGetDIBits
als eine Folge der RGB-Werte. Mit32
als bit-Anzahl (biBitCount
) stellt die Daten-Struktur nach MSDN:Da ein MS
LONG
ist genau 32 bit lang (von der Größe einesDWORD
), die Sie nicht haben, um die Aufmerksamkeit auf die Polsterung (wie beschrieben in der Abschnitt "Anmerkungen").Code:
GetDIBits
; AFAIK ist es nicht notwendig, re-initialisieren nach dem ersten Aufruf.biHeight
negativ sein kann, je nach Speicher-layout des ursprünglichen DIB.GetDIBits
gibt ein eindimensionales array von Werten. Für eine bitmap, die M Pixel breit und N Pixel hoch und verwendet 24-bit-Farbe, die ersten (M*3) Byte die erste Zeile von Pixeln. Werden können, gefolgt von ein paar padding bytes. Es hängt von der BITMAPINFOHEADER. Es ist in der Regel Polsterung, um die Breite ein Vielfaches von 4 bytes. Also, wenn Ihr bitmap ist 33 Pixel breit, es wird tatsächlich (36*3) bytes pro Zeile.Diese "Pixel plus Polsterung" heißt der "stride". Für RGB-bitmaps, können Sie berechnen, Schrittlänge mit:
stride = (biWidth * (biBitCount /8) + 3) & ~3
, wobiWidth
undbiBitCount
sind entnommen aus dem BITMAPINFOHEADER.Ich bin mir nicht sicher, wie Sie Sie möchten, Durchlaufen das array. Wenn Sie gehen wollen pixel-by-pixel von oben Links nach unten rechts (vorausgesetzt, diese ist ein top-down-bitmap):
Es ist nicht so einfach. Ihr Algorithmus hängt von der Farbtiefe des Bildes. Wenn es 256 oder weniger, Sie haben nicht pixel-Farben, aber indeces in einer palette von Farben. 16-bit-Pixel werden könnte, RGB555 oder RGB565, 24-bit-Bilder werden RGB888, und 32-bit-Bilder werden mit RGBA-oder ARGB. Sie müssen die BITMAPINFOHEADER, um das herauszufinden.
Sobald Sie herausfinden, die pixel-Daten wird nur ein array der Größe Breite * Höhe * (BitsPerPixel /8)
In dem link, den Sie posten, erstellen Sie ein 32-bit-bitmap-so nehme ich an, dass Sie beim Lesen eines 32-bit-bitmap (Diese Annahme kann falsch sein).
Daher ändern Sie Ihre Schleife um die folgenden arbeiten sollten:
Dinge zu beachten:
1.Arrays sind 0-basiert in C/C++
2. Sie wurden stepping 3 Pixel horizontal und vertikal jeder Zeit. Was bedeutete, dass Sie nicht besuchen jedes pixel.
3. Eine bitmap ist in der Regel so organisiert, dass es "Höhe" erstreckt sich von "Breite" Pixel. Deshalb sollten Sie Schritt für Schritt durch die einzelnen pixel in einen Bereich, und bewegen Sie dann zum nächsten span.
4. Wie bereits darauf hingewiesen, stellen Sie sicher, aare Lesen von Pixeln korrekt. in 16-bit-Modus mehr komplexe
Manche überraschung aus dem MSDN:
so, die Farben sind in BGR Reihenfolge im Speicher nach dem GetDIBits()