DIB korrekt zeichnen
-
Hallo!
Ich habe eine DIBSection erstellt und möchte nun das resultierende HBITMAP mit BitBlt zeichnen. DIBs werden ja komplett Spiegelverkehrt dargestellt (d.h. die KO (0,0) sind im rechten, unteren Eck), BitBlt verwendet aber das normale Computerkoordinatensystem. Wie kann ich das DIB korrekt zeichnen?
-
Wenn Du das DIB ja schon "darstellst" dann brauchst Du es ja nicht nochmals zu zeichenen

Und wenn Du das DIB spiegelverkehrt erzeugst, darfst Du Dich natürlich nicht wundern, dass es auch so mit BitBlt angezeigt wird...
Aber mal ganz im ernst: wie kommst Du denn darauf, dass (0,0) unten rechts sein soll?
GetDIBits schrieb:
The origin for a bottom-up DIB is the lower-left corner of the bitmap; the origin for a top-down DIB is the upper-left corner.
-
Ooops, da habe ich mich wohl ein wenig geirrt
. Stimmt, (0, 0) ist in der unteren, linken Ecke.Wieso muss ich das DIB neu zeichnen?
Nun, das ganze ist wiederrum Teil meiner, dir wohl schon bekannten Reihe "Wie komme ich um GDI+ herum?"
. Ich bin damit soweit fertig, das einzige Problem besteht noch darin das Bild korrekt auf den Bildschirm zu bekommen. Ich erstelle das DIB folgendermaßen:
1. CreateDIBSection()
2. Ich rufe die LockBits() Methode in einem GDI+ Bitmap auf
3. Ich kopiere die BitsLeider ist das DIB Top-Down wenn ich es vom GDI+ Bitmap kopiere. Deswegen brauche ich auch entweder einen Weg, wie ich es korrekt auf den Bildschirm zeichne oder eine Möglichkeit die Bits im Kopiervorgang schon richtig anzuordnen.
-
Ich denke ich hab' jetzt die Lösung:
private void CopyMemoryReversed(byte* dest, byte* src, uint length) { src += length; for (int y = 0; y < height; ++y) { src -= rowStride; for (int x = 0; x < width; ++x) { for (int i = 0; i < bytesPerPixel; ++i) dest[i] = src[i]; dest += bytesPerPixel; src += bytesPerPixel; } src -= rowStride; } }Anstelle die Bits mit einer WinAPI Funktion zu kopieren, kopiere ich sie selbst und ordne sie dabei richtig an.