Directory Contents Search << >>


DaVinci 4: Leonardo: Funktion TransformDIB

Die 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 WINAPI 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.

Rückgabewert:

Der Rückgabewert ist TRUE, wenn die Transformation erfolgreich abgeschlossen wurde. Er ist FALSE, wenn ein Problem erkannt wurde.

Arbeitsweise:

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:

TransformDIB gibt eine Ziel-Pixelkoordinate vor,

mit der fnPoint-Callback-Funktion wird die zugehörige Koordinate in der Quell-DIB bestimmt,

der Farbwert des Pixels in der Quell-DIB wird bestimmt,

mit der fnColor-Callback-Funktion wird die gewünschte Farbe im Ziel-DIB bestimmt,

der Farbwert wird in die Ziel-DIB eingetragen.

Ändern der Farbtiefe

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.

Callback-Funktionen

Für TransformDIB können Sie zwei Arten von Callback-Funktionen definieren:

Koordinaten-Transformation:

BOOL WINAPI _export TransformPoint(UINT msg, LPPOINT lppt, LONG lParam);

bzw. in Pascal:

Function TransformPoint(msg : Word; lppt : PPoint; lParam : LongInt) : Bool; export;

Farb-Transformation

BOOL WINAPI _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:

Rückgabewert:

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.

Beispiele

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 DIBRotate ist, dass 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 DIBRotate-Funktion in den Hilfetext aufgenommen, so dass Sie ihn an Ihre Wünsche Anpassen können.

Quellcode ROTATE.C

-


Valid HTML 4.01!