Referenz - PUT (Grafik)
Syntax: PUT [ZielPuffer,] [STEP] (x, y), QuellPuffer [(x1, y1)-[STEP](x2, y2)] [, Aktionswort [Parameterliste] ]
Typ: Anweisung/Funktion
Kategorie: Grafik
PUT überträgt Daten (einen Bildausschnitt) aus einem Puffer auf den Bildschirm oder in einen anderen Puffer. Die Datenquelle ist vom selben Format, wie es bei GET (Grafik) verwendet wird.
- 'ZielPuffer' ist ein Bildpuffer, wie er mit IMAGECREATE verwendet wird. Wird 'ZielPuffer' ausgelassen, zeichnet FreeBASIC direkt auf den Bildschirm.
- 'STEP' gibt an, dass die darauf folgenden Koordinaten relativ zum aktuellen Grafikcursor angegeben sind.
- '(x, y)' sind die Koordinaten der linken oberen Ecke des Bereichs, der gezeichnet werden soll.
- 'QuellPuffer' ist der Name das Puffers, in dem der zu zeichnende Bildschirmausschnitt gespeichert ist. Ebenso wie 'ZielPuffer' handelt es sich hierbei um einen Bildpuffer, wie er unter oben angegebenen Link erklärt wird.
- '(x1, y1)' und '(x2, y2)' sind die gegenüberliegenden Eckpunkte eines Koordinatenbereichs innerhalb des Quellpuffers, der ausgegeben werden soll. Der Rest des gespeicherten Bildausschnitts wird nicht ausgegeben. Wird dieser Bereich ausgelassen, so gibt FreeBASIC den kompletten Pufferinhalt aus.
- 'Aktionswort' ist entweder PSET, PRESET, AND, OR, XOR, TRANS, ALPHA, ADD oder CUSTOM. Das Aktionswort legt fest, wie die zu zeichnende Grafik (die gespeicherten Daten aus dem Quellpuffer) mit den Pixeln auf dem Bildschirm interagieren sollen. Weiter unten werden die Details dazu aufgelistet. Wenn 'Aktionswort' ausgelassen wird, nimmt FreeBASIC XOR an.
- 'Parameterliste' sind Argumente, die im Zusammenhang mit 'Aktionswort' gefordert werden; siehe unten für Details.
- Wird PUT als Funktion eingesetzt, ist der Rückgabewert eine der FreeBASIC-Fehlernummern. Die Syntax bleibt die gleiche, allerdings müssen die Parameter in Klammern gesetzt werden, z. B.:
Ergebnis = PUT( (10, 10), myPic, TRANS )
Die Koordinaten sind abhängig von den letzten VIEW- und WINDOW-Anweisungen. Die Ausgabe auf dem Bildschirm hängt ab von den im Puffer gespeicherten Daten, dem Aktionswort und den bereits gesetzten Pixeln.
Abhängig vom Aktionswort wird die Farbnummer der zu zeichnenden Pixel auf unterschiedliche Art und Weise berechnet; für die Aktionswörter PSET, PRESET und TRANS werden zu dieser Berechnung nur die Daten aus dem Quellpuffer herangezogen. Für die anderen Aktionswörter wird zusätzlich die Farbe des Pixels zur Berechnung herangezogen, das überzeichnet werden soll. Beachten Sie, dass das Ergebnis hier auch von der Farbtiefe abhängig ist; während in Modi bis 8bpp die Farbe der ausgegebenen Pixel von der Palette abhängt, stellt bei allen höheren Modi dieselbe Farbnummer auch immer dieselbe Farbe dar.
Aktionswort | Interaktion der Pixel |
---|---|
PSET | Das gespeicherte Pixel überschreibt das Pixel auf dem Bildschirm. Mit diesem Aktionswort wird also tatsächlich der Bildschirmausschnitt ausgegeben, der im Puffer gespeichert wurde. |
PRESET | Die gespeicherten Pixel werden invertiert und überschreiben die Pixel auf dem Bildschirm. Der neue Farbwert ist das Ergebnis aus NOT (alter Farbwert). Das Aktionswort PRESET entspricht also PSET, mit dem Unterschied, dass ein invertiertes Bild ausgegeben wird. |
AND | Auf dem Bildschirm wird ein Pixel ausgegeben, dessen Farbnummer das Ergebnis eines logischen AND mit dem Pixel auf dem Bildschirm und dem im Puffer gespeicherten Pixel ist. |
OR | Auf dem Bildschirm wird ein Pixel ausgegeben, dessen Farbnummer das Ergebnis eines logischen OR mit dem Pixel auf dem Bildschirm und dem im Puffer gespeicherten Pixel ist. |
XOR | Auf dem Bildschirm wird ein Pixel ausgegeben, dessen Farbnummer das Ergebnis eines logischen XOR mit dem Pixel auf dem Bildschirm und dem im Puffer gespeicherten Pixel ist. XOR ist das Standard-Aktionswort. |
TRANS | Die Pixel auf dem Bildschirm werden wie bei PSET durch die gespeicherten Pixel überschrieben. Wenn das gespeicherte Pixel die Masken-Farbe (siehe unten) besitzt, wird es ausgelassen, das Original-Pixel auf dem Bildschirm wird dann nicht überschrieben. |
ALPHA [, AlphaWert] | Mit ALPHA lassen sich Transparenz-Effekte erzeugen. Die ALPHA-Methode wird verwendet, um Bildschirmausschnitte 'durchscheinend' auszugeben; das Ergebnis der Bildschirmausgabe ist eine 'Mischfarbe' aus dem Pixel, das überzeichnet wurde, und dem, das im Quellpuffer gespeichert war. Das Aktionswort ALPHA ist nur in hi/truecolor-Modi verfügbar, also in Modi ab 15bpp. 'AlphaWert' stellt den Transparenzgrad des zu zeichnenden Ausschnitts bzw. das Mischungsverhältnis der beiden Farben dar; 255 bedeutet dabei volle Überdeckung, 0 keine Überdeckung. 127 ist der exakte Mittelwert zwischen den beiden Farben. Soll ein Pixel in der Maskenfarbe gezeichnet werden (siehe unten), so arbeitet ALPHA wie TRANS, d. h. Flächen in der Maskenfarbe werden nicht gezeichnet. In 32bpp-Modi ist es auch zulässig, den Parameter 'AlphaWert' auszulassen; in diesem Fall benutzt FreeBASIC den Alphawert, der für jedes Pixel einzeln angegeben wurde. Dies ist nur in 32bpp-Modi möglich, da nur hier ein eingebetteter Alphawert für jedes Pixel möglich ist; siehe dazu auch Interne Pixelformate. Wird 'AlphaWert' ausgelassen, jedoch ein Modus mit einer Farbtiefe unter 32bpp verwendet, so geht FreeBASIC von AlphaWert = 255 aus; dies entspricht völliger Überdeckung bzw. dem Aktionswort TRANS. |
ADD [, Faktor] | Die Farbnummer des gespeicherten Pixels wird mit 'Faktor' multipliziert und zur Sättigung des zu überzeichnenden Pixels addiert. 'Faktor' ist ein Wert zwischen 0 und 255. Ebenso wie TRANS und ALPHA werden Flächen in der Maskenfarbe nicht gezeichnet. Das Ergebnis der ADD-Methode sind ebenso wie bei ALPHA durchscheinende Bildschirmausschnitte. Der Transparenzgrad des Ausschnitts ist jedoch nicht nur vom angegebenen Faktor abhängig, sondern auch von der Helligkeit des darunter liegenden Pixels. Beim Überzeichnen schwarzer Pixel verhält sich ADD wie ALPHA; mit zunehmender Helligkeit des zu überzeichnenden Pixels allerdings verschiebt sich das Gleichgewicht der Farbmischung hin zur Transparenz des zu zeichnenden Pixels. Wird 'Faktor' ausgelassen, nimmt FreeBASIC automatisch Faktor = 255 an. Siehe auch Beispiel 2 zum Unterschied zwischen ADD und ALPHA. |
CUSTOM, blender [, parameter] | 'blender' ist ein Pointer auf eine Funktion der Form FUNCTION blender ( BYVAL src AS UINTEGER, BYVAL dst AS UINTEGER, BYVAL parameter AS ANY PTR) AS UINTEGER 'src' ist die Farbe des gespeicherten Pixels, 'dst' ist die Farbe des Pixels, das überschrieben werden soll. 'parameter' ist ein Pointer auf eine beliebige Speicherstruktur, mit der Informationen an die Funktion übergeben werden können. Wird 'parameter' ausgelassen, so nimmt FreeBASIC automatisch 'parameter = 0' an. Das Ergebnis der FUNCTION ist die Farbe des neuen Pixels. Diese Funktion wird für jedes neu zu zeichnende Pixel aufgerufen; die Farbe wird jedes Mal neu berechnet. Achten Sie beim Einsatz dieses Aktionsworts darauf, dass die Ausführungsgeschwindigkeit unter aufwändigen Berechnungen leiden wird! |
Die Maskenfarbe hängt von der aktuellen Farbtiefe ab; bei bis zu 8bpp ist sie 0, in den höheren Modi (15, 16, 24 und 32 bpp) ist sie &hFF00FF (helles Pink). Wollen Sie in Ihrem Programm einen Transparenzeffekt UND ein helles Pink verwenden, müssen Sie die Bildteile, die nicht transparent sein sollen, durch ein anderes Pink ersetzen. In der Regel ist der Farbunterschied zwischen &hFF00FF und &hFF01FF mit bloßem Auge nicht zu erkennen.
Als weitere Alternative kann eine Blendermaske erzeugt werden. Hierbei erstellt man eine Schwarz-Weiß-Maske unter Berücksichtigung der Maskenfarbe und mischt diese mit dem zu überschreibenden Bildbereich. Anschließend kopiert man diese mit OR auf die zu überzeichnende Fläche. Zum Schluss kann das Bild, das man kopieren möchte, über diesen Bereich geschrieben werden.
Der Trick liegt darin, den Hintergrund teilweise über einen Zwischenschritt in das eigentliche Bild zu integrieren. Ein weiterer Vorteil ist hier auch, das eine beliebige Farbe als Transparenzfarbe genutzt werden kann. Natürlich muss die Farbe bekannt sein, wenn die Schwarz/Weiß-Maske erzeugt wird.
Die im Puffer gespeicherten Pixel müssen zur aktuellen Farbtiefe kompatibel sein; wenn Sie ein Bild mit GET einlesen und später die Farbtiefe via SCREENRES ändern, kann es sein, dass die gespeicherten Daten nicht mehr kompatibel sind, sodass PUT mit diesem Puffer nicht richtig eingesetzt werden kann. Eine Konversion zwischen verschiedenen Farbtiefen ist mit IMAGECONVERTROW möglich.
Beispiel 1: Überblick über die verschiedenen Methoden
Declare Function checkered_blend( BYVAL src As UInteger, _
ByVal dest As UInteger, _
ByVal param As Any Ptr ) AS UInteger
Screenres 320, 240, 16
Dim As Byte Ptr sprite ' Speicher für ein 32x32-Pixel-
sprite = ImageCreate( 32, 32 ) ' Sprite reservieren
Line sprite, ( 0, 0 )-( 31, 31 ), &hFF0000, BF ' ein Sprite Zeichnen
Line sprite, ( 0, 0 )-( 31, 31 ), &h00FF00, B
Line sprite, ( 8, 8 )-( 23, 23 ), &hFF00FF, BF
Line sprite, ( 1, 1 )-( 30, 30 ), &h0000FF
Line sprite, ( 30, 1 )-( 1, 30 ), &h0000FF
Dim As Integer i
For i = 0 To 63 ' Einen Hintergrund zeichnen
Line( i, 0 )-( i, 240 ), RGB( i * 4, i * 4, i * 4 )
Next i
' Alle Methoden demonstrieren
Put ( 8, 8 ), sprite, PSET : Locate 3,12 : Print "PSET"
Put Step( 16, 24 ), sprite, PRESET : Locate 6,12 : Print "PRESET"
Put Step( -16, 24 ), sprite, AND : Locate 9,12 : Print "AND"
Put Step( 16, 24 ), sprite, OR : Locate 12,12 : Print "OR"
Put Step( -16, 24 ), sprite, XOR : Locate 15,12 : Print "XOR"
Put Step( 16, 24 ), sprite, TRANS : Locate 18,12 : Print "TRANS"
Put Step( -16, 24 ), sprite, ALPHA, 96 : Locate 21,12 : Print "ALPHA"
Put Step( 16, 24 ), sprite, ADD, 192 : Locate 24,12 : Print "ADD"
Put Step( -16, 24 ), sprite, CUSTOM, @checkered_blend
Locate 27,12 : Print "CUSTOM"
ImageDestroy( sprite ) ' Speicher wieder freigeben
Sleep
' Benutzerdefinierter Blender: Karierte Ausgabe des Sprites
Function checkered_blend( ByVal src As UInteger, _
ByVal dest As UInteger, _
ByVal param As Any Ptr ) As UInteger
Static cnt As UInteger
Dim As UInteger pixel = IIF(((cnt And 4)ShR 2) XOR ((cnt And 128) ShR 7), src, dest)
cnt += 1
Return pixel
End Function
Beispiel 2: Unterschiede zwischen ALPHA und ADD
Screenres 400, 300, 16
Dim As Any Ptr sprite ' Speicher für ein 32x32-Pixel-
sprite = ImageCreate( 32, 32 ) ' Sprite reservieren
Line sprite, ( 0, 0 )-( 31, 31 ), &hFF0000, BF ' ein Sprite Zeichnen
Line sprite, ( 0, 0 )-( 31, 31 ), &h00FF00, B
Line sprite, ( 8, 8 )-( 23, 23 ), &hFF00FF, BF
Line sprite, ( 1, 1 )-( 30, 30 ), &h0000FF
Line sprite, ( 30, 1 )-( 1, 30 ), &h0000FF
Cls
Dim As Integer i : FOR i = 0 TO 63 ' Einen Hintergrund zeichnen
Line( i , 0 )-( i , 300 ), RGB( i * 4, i * 4, i * 4 )
Line( i + 128, 0 )-( i + 128, 300 ), RGB( i * 4, i * 4, i * 4 )
Next i
Put( 0, 0 ), sprite, ADD , 0
Put( 32, 0 ), sprite, ADD , 0
Put( 128, 0 ), sprite, ALPHA, 0
Put( 160, 0 ), sprite, ALPHA, 0
Draw String (240, 8), "0"
For i = 1 To 8
Put ( 0, I * 32), sprite, ADD , i * 32 - 1
Put ( 32, I * 32), sprite, ADD , i * 32 - 1
Put ( 128, I * 32), sprite, ALPHA, i * 32 - 1
Put ( 160, I * 32), sprite, ALPHA, i * 32 - 1
Draw String (240, I * 32 + 8), Str(i * 32 - 1)
Next
Sleep
Unterschiede zu QB:
- In FreeBASIC ist es möglich, in einen Datenpuffer zu zeichnen.
- Die Methoden TRANS, ALPHA, ADD und CUSTOM sind neu in FreeBASIC.
- In QB können als Bildquelle nur Arrays verwendet werden.
- Das interne Speicherformat für Images in FreeBASIC unterscheidet sich von dem in QB. QB kann das Speicherformat von FreeBASIC nicht verarbeiten.
- FreeBASIC unterstützt Clipping (Einhaltung der Bildschirmgrenzen). QB erzeugt bei Koordinaten außerhalb der Bildschirmgrenzen eine Fehlermeldung.
Unterschiede zu früheren Versionen von FreeBASIC:
- Seit FreeBASIC v0.18.0 kann in der Angabe des darzustellenden Teilbereichs (x1, y1)-(x2, y2) das Schlüsselwort STEP verwendet werden.
- Der Parameter 'param' in der Funktion 'blender' für das Aktionswort CUSTOM existiert seit FreeBASIC v0.17.
- Das Aktionswort ADD existiert seit FreeBASIC v0.17.
- Die Möglichkeit, nur einen Teilbereich des gespeicherten Bildausschnitts auszugeben, besteht seit FreeBASIC v0.15.
- Die Möglichkeit, einen Zielpuffer anzugeben, existiert seit FreeBASIC v0.15.
- Die Aktionswörter ALPHA und CUSTOM existieren seit FreeBASIC v0.14.
- Seit FreeBASIC v0.14 bricht PUT mit einer Fehlermeldung ab, wenn versucht wird, ein Bild auszugeben, das für eine andere Farbtiefe als die aktuell gültige erstellt wurde.
- Die Möglichkeit, anstelle von Arrays auch Pointer als Puffer anzugeben, existiert seit FreeBASIC v0.12.
Siehe auch:
PUT (Datei), GET (Grafik), IMAGECREATE, SCREENRES, Interne Pixelformate, Grafik
Zusätzliche Informationen und Funktionen | ||||
---|---|---|---|---|
|