4 Stimmen

Wie stelle ich fest, ob ein DIB bottom-up oder top-down ist?

Wenn ich eine DIB mit CreateDIBSection() kann ich festlegen, ob es von oben nach unten oder von unten nach oben gehen soll, indem ich die biHeight Feld des BITMAPINFOHEADER Struktur auf einen negativen oder positiven Wert. Wenn ich jedoch GetObject() auf eine solche Bitmap, um eine DIBSECTION Struktur, dann werden sowohl die dsBm.bmHeight y dsBmih.biHeight scheinen immer positiv zu sein.

Gibt es eine Möglichkeit, herauszufinden, ob ein DIB Top-Down oder Bottom-Up ist, wenn ich nur die HBITMAP ?

1voto

chaos Punkte 118918

Nein, dafür brauchen Sie den BITMAPINFOHEADER, und der kann nicht aus einer HBITMAP wiederhergestellt werden.

1voto

Chris Becke Punkte 32199

Es gibt keine Möglichkeit, diese Informationen aus der GDI abzurufen. Wie Sie bereits festgestellt haben, sind die Felder BITMAP und BITMAPINFOHEADER bmHeight, die über GetObject abgerufen werden, immer positiv. Das Feld bmWidthBytes ist ebenfalls positiv. Wenn Sie mit dem GDI-Handle auf (oder von) dem DIBSection zeichnen, wird GDI den DIBSection in der richtigen Richtung nach oben zeichnen. Wenn Sie den extrahierten BITMAPINFOHEADER verwenden, werden die Bitmaps von oben nach unten falsch dargestellt.

Der einzige Weg, von Usermode zu sagen, scheint zu sein, GDI zu verwenden, um zu testen - SetPixel die obere linke und untere linke Pixel der Bitmap auf zwei verschiedene Werte, dann lesen Sie den Puffer, um zu sehen, welche schreiben in der ersten Speicherposition gelandet.

Am besten ist es, dies in Ihre API einzubauen - wenn Sie eine DIBSection als HBITMAP übergeben, stellen Sie sicher, dass mindestens ein bool fIsDibSectionTopDown übergeben oder gespeichert wird.

0voto

Jim H. Punkte 5429

Ich denke, das Beste, was man von einer HBITMAP bekommen kann, ist GetDIBits. Das Problem mit GetDIBits ist jedoch, dass es auch einen HDC erfordert und die HBITMAP muss eine DDB sein.

siehe: GetDIBits-Funktion

Ich bin mir nicht sicher, aber es ist möglich, dass Sie bei der Umwandlung etwas von oben nach unten verlieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X