[winAPI] hDC Pixel direkt auslesen

uhu01

Erfahrenes Mitglied
Hy!

Noch ein blödes Thema zu winAPI:

Wie kann ich auf die einzelnen Pixel eines DC's direkt zugreifen (über Pointer etc.),
anstatt über SetPixel und GetPixel, die beiden sind leider zu langsam.

mfg
uhu01
 
moin


Vielleicht mit BitBlt, oder du brauchst nen Pointer auf den Anfang des DC und gehst dann bis zum Pixel weiter.
Das Thema gab es hier glaub ich schonmal.


mfg
umbrasaxum
 
Ist der DC von deinem Fenster? Dann würde ich da schon von beginn an eine DIBSection (Mit CreateDIBSection erzeugt) reinsetzen. Dann hast du von Anfang an einen Pointer auf die Daten.

Sonst brauchst du mindestens ein HBITMAP. Da kannst du GetObject mit einem BITMAP struct benutzen, da bekommst du auch einen Pointer auf die Daten.

Noch ein Haken: Wenn du den Pointer bekommst, sind die Pixeldaten 1bit, 4bit, 16bit (nur 555), 24bit oder 32bit. Du musst dann selber die Umrechnung in dein Lieblingsformat machen.
 
Hy!

Es geht eigentlich darum, Punkte die bestimmten Filterkriterien entsprechen schwarz zu färben, und alle anderen weiss. Das Bild kommt von einer Webcam, ich habe also einen BITMAPINFOHEADER, ein HBITMAP, ein und einen DC in das das Bild geblittet worden ist. Ich habe auch schon versucht mit dem HBITMAP zu arbeiten, nur bekomme ich in den Randbereichen manchmal andere Farben, als im Bild eigentlich zu sehen sind.

Und noch ne zweite kleine Frage: Woran kann es liegen, das ich nach dem einlesen eines Bildes von der Webcam das Bild korrekt im Speicher habe (mit Paint probiert) jedoch nach dem erstellen eines DIBitmaps und selektieren in einen Memory-DC und darauffolgendes blitten immer ein Streifen der ca. 15 Pixel breit ist und eigentlich auf der rechten Seite des Bildes sein sollte sich am linken Rand des Bildes befindet. Nicht gespiegelt, nichts. Ganz normal, nur am falschen Platz.

mfg
uhu01
 
Dann ist irgendwas beim Erstellen des DIBitmaps nicht ganz sauber? Das klingt nach verschobenen Pixeldaten. Eventuell ein paar Header-Bytes weggelassen?

Hinweis: Manchmal sind bei Bitmaps im Speicher noch 3 Masken-DWORDs dabei, für RGB. Da hab ichs: Wenn BITMAPINFOHEADER.biCompression == BI_BITFIELDS, dann sind die Pixeldaten
an der Adresse ( (BYTE*)pBIH ) + pBIH->biSize + PaletteSize( (BYTE*)pBIH ) Plus die 3 Masken-DWORDs
 

Neue Beiträge

Zurück