Herd Software Entwicklung
DaVinci Grafikbibliothek
DaVinci Dokumentation
Leonardo: Funktion TransformDIBDie Funktion TransformDIB überführt die Bildinhalte einer Quell-DIB in eine Ziel-DIB. Mittels zweier durch die Applikation bereitgestellter Callback-Funktionen kann die Applikation während des Kopiervorganges Koordinaten- und Farbtransformationen ausführen.
BOOL FAR PASCAL TransformDIB(
HDIB hDibSource,
HDIB hDibDest,
FNTRANSFORMPOINT fnPoint,
FNTRANSFORMCOLOR fnColor,
LONG lParam,
COLORREF clBkColor
);
hDIBSource Handle der Quell-DIB. Es darf sich um eine DIB mit 1,4,8,16,24,32 oder 48 Bit Farbtiefe handeln.
Das übergebene Handle bleibt gültig.
hDIBDest Handle der Ziel-DIB. Es darf sich um eine DIB mit 1,4,8,16,24,32 oder 48 Bit Farbtiefe handeln.
Das übergebene Handle bleibt gültig.
Quell- und Ziel-DIB dürfen sich in der Farbtiefe unterscheiden.
fnPoint Von der Applikation bereitgestellte Callback-Funktion zur Koordinatentransformation oder NULL, wenn keine Koordinatentransformation benötigt wird.
fnColor Von der Applikation bereitgestellte Callback-Funktion zur Farbtransformation oder NULL, wenn keine Farbtransformation benötigt wird.
lParam Freier Zusatzparameter zur Weitergabe an die Callback-Funktionen.
clBkColor Farbe für Punkte, die bei der Koordinatentransformation in einen ungültigen Bereich verweisen.
Vergleiche Windows API RGB-Makro und COLORREF bzw TColorRef Typ..
Der Sonderwert -1 (0xFFFFFFFFL) bedeutet. Keine Beeinflussung erwünscht.
Der Rückgabewert ist TRUE, wenn die Transformation erfolgreich abgeschlossen wurde. Er ist FALSE, wenn ein Problem erkannt wurde.
Die Funktion TransformDIB entnimmt die Daten der Quell-DIB pixelweise und trägt sie in die Ziel-DIB ein.
Für jedes Pixel, die Ziel-DIB, wird der zugehörige Farbwert bestimmt.
Folgende Schritte werden für jedes Pixel ausgeführt:
Ohne eine von der Applikation bereitzustellende Callback-Funktion kann TransformDIB lediglich eine Quell-DIB in eine Ziel-DIB beliebiger Farbtiefe überführen.
Dazu erzeugen Sie mit CreateDIB eine DIB der gewünschten Farbtiefe und kopieren Sie die Pixeldaten mit der Funktion TransformDIB.
TransformDIB unterstützt neben den Standard-DIB-Formaten mit 1,4,8 und 24 Bit Farbtiefe auch DIBs mit 16 und 32 Bit Farbtiefe, wie sie ab Windows NT 3.5 und Windows 95 spezifiziert wurden.
Für TransformDIB können Sie zwei Arten von Callback-Funktionen definieren:
Koordinaten-Transformation: BOOL FAR PASCAL _export TransformPoint(UINT msg, LPPOINT lppt, LONG lParam);
bzw. in Pascal: Function TransformPoint(msg : Word; lppt : PPoint; lParam : LongInt) : Bool; export;
Farb-Transformation BOOL FAR PASCAL _export TransformColor(UINT msg, LPPOINT lppt, LONG lParam, LPRGBQUAD16 lprgbq16);
bzw. in Pascal: Function TransformColor(msg : Word; lppt : PPoint; lParam : LongInt; PixelColor : PrgbQuad16) : Boolean; export;
die Namen TransformPoint und TransformColor sind Stellvertreter für applikationsspezifische Namen. Die Adressen der Funktionen werden beim Aufruf von TransformDIB angegeben.
msg Beide Callback-Funktionen werden von TransfromDIB zu Beginn und Ende der Verarbeitung aufgerufen, wobei der Parameter msg Auskunft über die Aktion gibt:
TRFM_INIT die Transformation beginnt. Die Callback-Routine kann Private Daten initialisieren,
TRFM_LINE wird vor Beginn der Verarbeitung einer Zeile gesendet. In lppt->y steht die Zeilennummer. Günstiger Zeitpunkt für die Pflege einer Fortschrittsbalkens,
TRFM_PIXEL die Daten eines Pixels sind zu verarbeiten. lppt gibt die Pixel-Koordinate an,
TRFM_EXIT die Transformation ist beendet. Temporäre Datenobjekte können freigegeben werden,
lppt Zeiger auf eine POINT-Struktur mit den Koordinaten des zu transformierenden Punktes. NULL bei TRFM_INIT und TRFM_EXIT,
lParam lParam-Wert wie beim Aufruf von TransformDIB. Hier kann die Applikation die Adresse oder Referenz zu einem Datenobjekt ablegen.
TransformPoint:
TRUE: das Pixel (TRFM_PIXEL) bzw. die Zeile (TRFM_LINE) wird von der Quellkoordinate in die Zielkoordinate übertragen,
FALSE: das Pixel (TRFM_PIXEL) bzw. die Zeile (TRFM_LINE) im Ziel-Koordinatensystem wird nicht beeinflußt.
Die gewünschten Quell-Koordinaten speichert die Applikation in die durch lppt adressierte POINT-Struktur ein.
TransformColor:
lprgbq16 Farbwert als RGBQUAD16 des Pixels in der Quell-DIB und nach der Transformation Ziel-DIB.
Rückgabewert: TRUE, falls das Pixel übertragen werden soll, FALSE, falls das Pixel nicht übertragen werden soll.
DLL-Grenzen überschreitende Callback-Routinen erfordern etwas zusätzliche Sorgfalt in 16-Bit-Windows Versionen. Sehen Sie dazu bei der Windows API-Funktion MakeProcInstance und im Compiler-Handbuch unter Smart Callbacks oder Intelligente Callbacks nach.
Die umständliche Arbeitsweise mit MakeProcInstance ist notwendig, wenn sie keine Smart Callbacks verwenden wollen und der Programmcode des Callbacks auch nicht in einer DLL liegt.
In jedem Falle müssen Sie entweder alle Funktionen als exportierbar deklarieren (In Large-Model-Programmen nicht empfehlenswert) oder die Callback-Funktionen mit einem export Schlüsselwort versehen.
Diese Regeln sind dieselben Regeln, mit denen Sie in Ihrem Compiler auch eine Fensterfunktion anlegen.
1. Im Beispielprogramm DAVDEMO.CPP finden Sie eine Beispiel-Anwendung von TransformDIB zur Umwandlung einer DIB in monochrome Darstellung mit fließender Mittelwertentscheidung.
2. Ein unerwünschter Effekt der Funktion RotateDIB ist, daß sie bei großen DIBs recht lange dauert. Die Funktion kann aber nicht auf Teile einer DIB angewendet werden, daher scheint der Rechner in der Zwischenzeit "tot" zu sein.
Daher haben wir den Quellcode der RotateDIB-Funktion in den Hilfetext aufgenommen, so daß Sie ihn an Ihre Wünsche Anpassen können.