Pixels vom HBitMap

Hallo,

ich habe im Globalen Speicher ein BitMap und ein zugehöriges Handle HBITMAP hbitmap.
Ich möchte nun von links oben nach rechts unten die RGB-Werte aller Pixel auslesen. Habe das so probiert:

int w, h;
BITMAP bm;
HDC hDC, hMemDC;
COLORREF colorref;

{
 hDC = GetDC(NULL);
 hMemDC = CreateCompatibleDC(hDC);
 GetObject(hbitmap, sizeof(BITMAP), (LPSTR)&bm);
 SelectObject(hMemDC, hbitmap);

 w = bm.bmWidth;
 h = bm.bmHeight;

 for(int height = 0; height 
Kann mir jemand sagen, wo mein Fehler liegt, bzw. wie er da vorgehen würde ?

Vielen Dank Euch,
Lars

Hi,

> int w, h;  
> BITMAP bm;  
> HDC hDC, hMemDC;  
> COLORREF colorref;  
>   
> {  
> hDC = GetDC(NULL);  
> hMemDC = CreateCompatibleDC(hDC);  
> GetObject(hbitmap, sizeof(BITMAP), (LPSTR)&bm);  
> SelectObject(hMemDC, hbitmap);  
>   
> w = bm.bmWidth;  
> h = bm.bmHeight;  
>   
> for(int height = 0; height colorref = GetPixel(hMemDC, w, h);  
> // if(colorref == CLR\_INVALID) printf("SHIT");  
> }  
> }  
> }

Kann mir jemand sagen, wo mein Fehler liegt, bzw. wie er da
vorgehen würde ?

Ich würde in der Schleife wenigstens die Laufvariablen height und width ansprechen statt den absoluten Größenangaben h und w…

Gruß

J.

Zum Glück gibt es Menschen, die andere Menschen vor dem finalen Wutausbruch bewahren…

Danke !

Lars

Hallo,
diese Funktion ist relativ zeitaufwendig, da jedes Mal erneut auf den Datenspeicher zugegriffen werden muss. Bei zeitkritischeren häufigeren Zugriffen dürfte es sinnvoller sein, direkt den ganzen Speicherbereich auszulesen und hierauf zu arbeiten, was über die Funktion GetDIBits geschehen kann. Dies ist aber programmiertechnisch komplizierter und es gibt keine gute geschlossene Erklärung dazu. So sind bei jeder Zeile am Ende Füllbytes (bei DC-Objekten Auffüllung auf Vielfaches von 4, bei CBitmap oder HBITMAP nur auf Vielfaches von 2 Bytes) zu berücksichtigen wie auch der wichtige Parameter Bits per Pixel, der den benötigten Platz jedes Pixels bestimmt. Noch schwieriger kann es bei Verwendung von Farbpaletten werden.

Gruß
Gerald

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]