Herd Software Entwicklung
DaVinci Grafikbibliothek
DaVinci Dokumentation
Bildbearbeitung mit Windows API FunktionenMicrosoft 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 RotateDIB und TransformDIB von Leonardo zur Verfügung gestellt.
Die folgenden Methoden geben Auskunft, wie Sie eine DIB indirekt mit Windows-Methoden bearbeiten können.
Um ein von ipImportInd geliefertes Bild mit Microsoft Windows zu bearbeiten, können Sie es mit der Funktion BitmapFromDIB in eine DDB umwandeln.
{ 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.
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.
Die Funktion CreateDIBSection erlaubt es unter WIN32, in DIBs nahezu ohne Einschränkungen Zeichenoperationen auszuführen.