Referenz - PUT (Grafik)
Syntax: PUT [ZielPuffer,] [STEP] (x, y), QuellPuffer [(x1, y1)-(x2, y2)] [,Aktionswort [Parameterliste] ]
Typ: Anweisung/Funktion
Kategorie: Gfx
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 im Sinne von Interne Pixelformate: Bildpuffer, wie er mit IMAGECREATE verwendet wird. Wird 'Puffer' ausgelassen, zeichnet FreeBASIC direkt auf den Bildschirm.
- '(x, y)' sind die Koordinaten der linken oberen Ecke des Bereichs, der gezeichnet werden soll.
- 'STEP' gibt an, dass die Koordinaten relativ zum aktuellen Grafikcursor angegeben sind.
- '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)-(x2, y2)' ist ein Koordinaten-Bereich 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. (Diese Möglichkeit besteht erst seit FreeBASIC v0.15)
- '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. Siehe die Tabelle unten für Details. 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 dabei die gleiche, allerdings müssen die Parameter in Klammern gesetzt werden, z.B.: [pre]Ergebnis = PUT( (10, 10), myPic, TRANS )[/pre]
Die Koordinaten sind abhängig von den letzten VIEW (Grafik)- und WINDOW-Anweisungen.
Die Ausgabe auf dem Bildschirm hängt ab von den im Puffer gespeicherten Daten, dem Aktionswort und den Pixeln, die bereits auf dem Bildschirm sind.
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:
| Aktionswort | Interaktion der Pixel |
|---|---|
| PSET | Gespeichertes Pixel überschreibt Pixel auf dem Bildschirm. Mit diesem Aktionswort wird also tatsächlich der Bildschirmausschnitt ausgegeben, der im Puffer gespeichert wurde. |
| PRESET | Die gespeicherten Pixel werden inventiert und überschreiben die Pixel auf dem Bildschirm. Der neue Farbwert ist das Ergebnis aus [pre]NOT (alter Farbwert)[/pre]. Das Aktionswort PRESET entspricht also PSET, mit dem Unterschied, dass ein invertiertes Bild ausgegeben wird. Beachten Sie, dass das Ergebnis hier auch von der Farbtiefe abhängig ist; während in Modi bis 8bpp die Farbe der ausgegebenen Pixel auch von der Palette abhängig ist, stellt bei allen höheren Modi dieselbe Farbnummer auch immer dieselbe Farbe dar. |
| AND | Auf dem Bildschirm wird ein Pixel ausgegeben, dessen Farbnummer das Ergebnis eines logischen ANDs mit dem Pixel auf dem Bildschirm und dem im Puffer gespeicherten Pixel ist. Beachten Sie, dass das Ergebnis hier auch von der Farbtiefe abhängig ist; während in Modi bis 8bpp die Farbe der ausgegebenen Pixel auch von der Palette abhängig ist, stellt bei allen höheren Modi dieselbe Farbnummer auch immer dieselbe Farbe dar. |
| OR | Auf dem Bildschirm wird ein Pixel ausgegeben, dessen Farbnummer das Ergebnis eines logischen ORs mit dem Pixel auf dem Bildschirm und dem im Puffer gespeicherten Pixel ist. Beachten Sie, dass das Ergebnis hier auch von der Farbtiefe abhängig ist; während in Modi bis 8bpp die Farbe der ausgegebenen Pixel auch von der Palette abhängig ist, stellt bei allen höheren Modi dieselbe Farbnummer auch immer dieselbe Farbe dar. |
| XOR | Auf dem Bildschirm wird ein Pixel ausgegeben, dessen Farbnummer das Ergebnis eines logischen XORs mit dem Pixel auf dem Bildschirm und dem im Puffer gespeicherten Pixel ist. Beachten Sie, dass das Ergebnis hier auch von der Farbtiefe abhängig ist; während in Modi bis 8bpp die Farbe der ausgegebenen Pixel auch von der Palette abhängig ist, stellt bei allen höheren Modi dieselbe Farbnummer auch immer die selbeFarbe dar. XOR ist das Standard-Aktionswort. |
| TRANS | Überschreibt die Pixel auf dem Bildschirm mit den gespeicherten wie bei PSET. Wenn das gespeicherte Pixel die Masken-Farbe (siehe unten) besitzt, wird es ausgelassen. (Das Original-Pixel auf dem Bildschirm wird 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 dabei 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 jeden Pixel einzeln angegeben wurde. Dies ist nur in 32bpp-Modi möglich, da nur hier ein eingebetteter Alphawert für jeden Pixel möglich ist; siehe dazu auch Interne Pixelformate. Wird 'AlphaWert' ausgelassen, jedoch ein Modi 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 dabei 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] |
|
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.
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 SCREEN (Anweisung) ändern, kann es sein, dass die gespeicherten Daten nicht mehr kompatibel sind, so dass PUT mit diesem Puffer nicht richtig eingesetzt werden kann. Eine Konversion zwischen verschiedenen Farbtiefen ist mit
IMAGECONVERTROW möglich.
Beispiel 1:
Declare Function checkered_blend( BYVAL src As UInteger, _
ByVal dest As UInteger, _
ByVal param As Any Ptr ) AS UInteger
Screen 14, 16 ' Bildschirmmodus 320x240 bei 16bpp
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 : End 0
' 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
Screen 15, 16 ' Bildschirmmodus 400x300 bei 16bpp
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:
- FreeBASIC unterstützt hi/truecolor-Sprites, Transparenzeffekte (auch Alpha-Blending) und Clipping (Einhaltung der Bildschirmgrenzen; QB erzeugte bei Koordinaten außerhalb der Bildschirmgrenzen eine Fehlermeldung).
- Bei Bildschirmmodi bis zu 8bpp wird immer 1 Byte pro Pixel im Array verwendet. QB konnte bei niedrigeren Farbtiefen mehrere Pixel in ein Byte 'packen'.
zu früheren FreeBASIC-Versionen:
- Der Parameter 'param AS ANY PTR' in der Funktion 'blender' für das Aktionswort CUSTOM existiert erst seit FreeBASIC v0.17.
- Das Aktionswort ADD existiert erst seit FreeBASIC v0.17.
- Die Möglichkeit, nur einen Teilbereich des gespeicherten Bildausschnitts auszugeben, besteht erst seit FreeBASIC v0.15.
- Die Möglichkeit, einen Zielpuffer anzugeben, existiert erst seit FreeBASIC v0.15.
- Das Aktionswort ALPHA existiert erst seit FreeBASIC v0.14.
- Das Aktionswort CUSTOM existiert erst 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 erst seit FreeBASIC v0.12.
Siehe auch:
PUT (Datei),
GET (Grafik),
IMAGECREATE,
SCREEN (Anweisung),
Interne Pixelformate
| Zusätzliche Informationen und Funktionen | ||||
|---|---|---|---|---|
|
||||





Versionen