Directory Contents Search << >>


DaVinci 4: DDB Device-Dependend Bitmaps

Konzept

DDB (Einheitenabhängige Bitmaps) sind das, was bei den meisten Windows API-Calls als "Bitmap" bezeichnet wurde. Funktionen wie CreateBitmap, LoadBitmap, BitBlt., StretchBlt ... arbeiten mit diesen DDBs.

Sie heißen deswegen einheitenabhängig, weil das Speicherungsformat vom Bildschirm/Druckertreiber abhängt.

Eine solche einheitenabhängige Bitmap ist nur anhand der Software-Schnittstelle (API) definiert. Daher ist es auch unsinnig, eine solche Bitmap in eine Datei zu übertragen. Um eine DIB in eine DDB zu überführen, verwendet die Anwendung die Funktion CreateDIBitmap bzw. BitmapFromDIB. Für die umgekehrte Transformation benutzt die Anwendung die Funktion GetDIBits bzw. DIBFromBitmap. Diese Funktionen erwarten jeweils die Angabe eines Device Context DC um den Grafiktreiber (Drucker, Bildschirm etc.) festzulegen. Viele Funktionen, wie LoadBitmap benutzen implizit den DC des Bildschirms. Die von LoadBitmap zurückgelieferte HBITMAP kann daher nicht auf jedem Drucker ausgegeben werden.

Jeder Grafiktreiber beherrscht neben seinem eigenen Datenformat zumindest das monochrome Schwarz/Weißformat, das daher auch zwischen den Einheiten ausgetauscht werden kann.

Bei der Konvertierung der Grafik in eine DDB wird die Farbtiefe der Bitmap auf die Farbtiefe des verwendeten DCs gebracht. Daher verliert eine Grafik in 256 Farben davon 240, wenn sie in eine DDB für ein Gerät mit 16 Farben konvertiert wird.

Vorteile

Der Vorteil der Einheitenabhängigkeit ist die hohe Geschwindigkeit bei der Ausgabe, sowie die Möglichkeit eine DDB mit den Mitteln des Grafikkartentreibers zu bearbeiten:

Beispiel: Zeichnen eines Textes in eine DIB unter Verwendung einer DDB

HDIB DrawTextInDIB(HDIB hDIB, LPCSTR szText)

{

HBITMAP hBitmap,

hbmo

HDC hMemDC;

HDIB hNewDIB;

hBitmap = BitmapFromDIB(hDIB, NULL);

hMemDC = CreateCompatibleDC(NULL);

hbmo = SelectObject(hMemDC, hBitmap);

TextOut( hMemDC, 10, 10, szText, lstrlen(szText) );

SelectObject(hMemDC, hbmo);

DeleteDC(hMemDC);

hNewDIB = DIBFromBitmap(hBitmap, BI_RGB, 0, NULL);

DeleteObject(hBitmap);

return hNewDIB;

}

Nachteile

Bei der Konvertierung von DDBs in DIBs können je nach Anwendungsfall Informationen verloren gehen.

Die Umwandlung einer DIB mit niedriger Farbtiefe aber vielen Pixeln (Breit und Hoch) kann zu einem enormen Speicherbedarf führen. Beispiel: DIB für ein Telefax = ca. 8 Millionen Pixel (1 MByte) als DDB für eine TrueColor-Grafikkarte 1 Million mal 3 Byte = 24 MByte.

Geschichte

Unter Windows 2.0 waren DDBs die einzige von Windows unterstützte Darstellung von Grafiken. Durch die Einführung von DIBs mit Windows 3.0 und der Entwicklung von Grafikkarten mit Beschleunigerchips wurde die Verwendung von DDBs in Windows-Programmen zurückgedrängt. Das WIN32 API kennt die Funktion CreateDIBSection um Zeichenvoränge direkt in DIBs auszuführen.

Neuere Microsoft-Empfehlungen gehen daher mehr und mehr von der Verwendung von DDBs weg. In vielen Fällen gibt es aber für viele Operationen noch keine Alternative zur Verwendung von DDBs. Z.B. ist die OLE/COM Komponente IPicture als DDB mit Farbpalette definiert.

-


Valid HTML 4.01!