Directory Contents Search << >>


Bildbearbeitung mit Windows API Funktionen

Achtung! Diese Seite ist Teil der noch unvollständigen Dokumentation der Alpha-Version von DaVinci 4.

Microsoft Windows stellt viele wichtige Funktionen zur Bildbearbeitung zur Verfügung.

Alle Zeichenanweisungen in Microsoft Windows beziehen sich auf Device-Context-Handles (HDC oder TDC). Zeichenanweisungen umfassen solche Funktionen wie LineTo oder Rectangle, aber auch Funktionen wie BitBlt oder PatBlt, mit denen Bitmaps ineinander kopiert werden können.

Leider stellen die 16-Bit-Windows-Fassungen keine Funktionen zum drehen oder komplexen transformieren von Bildern zur Verfügung. Daher wird entsprechende Funktionalität durch die Funktionen DIBRotate und TransformDIB von Leonardo zur Verfügung gestellt.

Die folgenden Methoden geben Auskunft, wie Sie eine DIB indirekt mit Windows-Methoden bearbeiten können.

1. Methode: Verwenden einer DDB

Um ein von ipImportInd geliefertes Bild mit Microsoft Windows zu bearbeiten, können Sie es mit der Funktion BitmapFromDIB in eine DDB umwandeln.

Nun benötigen Sie zum Zeichnen aber ein Device-Context-Handle. Dieses erhalten Sie von der Funktion CreateCompatibleDC (NULL). Um den Device-Context mit Ihrer DDB zu verbinden, benutzen Sie die Funktion SelectObject:

{ HDC hDC = CreateCompatibleDC(NULL);

HBITMAP hbm = BitmapFromDIB(hdib, NULL),

hbmold= (HBITMAP) SelectObject( hbm );

// Zeichenoperation ausführen .....

MoveToEx(hDC, 0, 0, NULL);

LineTo (hDC, 100, 100);

// Aufräumen

SelectObject( hDC, hbmold);

DeleteDC(hDC);

}

Beachten Sie, daß eine DDB für ein Fenster immer nur in der Farbtiefe des Bildschirm-Einheitenreibers (oder wahlweise monochrom) bearbeitet werden kann. Daher wird Ihre DIB mit 24 Bit TrueColor Daten evtl. für die Zeichenoperation mit erheblichem Qualitätsverlust in eine DDB mit nur 16 Farben überführt.

2. Methode: Verwenden des DIB.DRV (16-Bit)

Der mit Microsoft Windows 3.1 ausgelieferte Treiber DIB.DRV erlaubt die Erzeugung eines Device-Kontextes für eine DIB. Hauptvorteil ist die Unabhängigkeit dieses Treibers von der Grafikkarte, so daß auch bei einfachen VGA-Grafikkarten DIBs mit 24 Bit Farbtiefe ohne Qualitätsverlust bearbeitet werden können.

{ LPBITMAPINFOHEADER

lpBMI = (LPBITMAPINFOHEADER) GlobalLock(hDIB);

HDC hDC = CreateDC("DIB", NULL, NULL, (LPDEVMODE) lpBMI);

// Zeichenoperation ausführen .....

MoveToEx(hDC, 0, 0, NULL);

LineTo (hDC, 100, 100);

// Aufräumen

DeleteDC(hDC);

GlobalUnlock(hDIB);

}

Diese Funktionalität wird übrigens auch genutzt, wenn Sie in OWL 2.x ein TDC-Objekt mit einem Konstruktor durch ein TDib-Objekt erzeugen.

Diese Funktionalität wird bei der 32-Bit Anwendungsentwicklung nicht unterstützt, hier steht die Funktion CreateDIBSection zur Verfügung. Der DIB.DRV Treiber wird mit Windows 95 nicht mehr mitgeliefert (er ist jedoch Redistributable), in Windows NT ist die entsprechende Funktionalität integriert und der DIB.DRV daher nicht notwendig.

Auf ähnliche Weise wie DIB.DRV erlaubt auch WinG (Windows Games API) das Zeichnen in DIBs, allerdings ist WinG auch für 32-Bit Windows mit kompatiblem API verfügbar.

Sowohl WING als auch DIB.DRV haben Einschränkungen, so ist es z.B. nicht möglich mittels BitBlt eine DIB mit biBitCount = 24 in eine DIB mit biBitCount = 8 zu zeichnen.

3. Methode: Verwenden der Funktion CreateDIBSection

Die Funktion CreateDIBSection erlaubt es unter WIN32, in DIBs nahezu ohne Einschränkungen Zeichenoperationen auszuführen.

-


Valid HTML 4.01!