Buchempfehlung
MySQL kurz & gut
MySQL kurz & gut
Das preiswerte Taschen- buch stellt MySQL-rele- vante Inhalte systematisch und knapp dar, sodass es sich optimal zum Nach- schlagen beim Pro- grammieren eignet. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )


Referenz - PUT (Grafik)

Referenz-Navigation

 

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.

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:

AktionswortInteraktion der Pixel
PSETGespeichertes Pixel überschreibt Pixel auf dem Bildschirm.
Mit diesem Aktionswort wird also tatsächlich der Bildschirmausschnitt ausgegeben, der im Puffer gespeichert wurde.
PRESETDie 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.
ANDAuf 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.
ORAuf 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.
XORAuf 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]
  • 'blender' ist ein Pointer auf eine Funktion der Form
    [pre]FUNCTION blender ( BYVAL src AS UINTEGER, BYVAL dst AS UINTEGER, BYVAL parameter AS ANY PTR) AS UINTEGER[/pre]
  • 'src' ist die Farbe des gespeicherten Pixels.
  • 'dst' ist die Farbe des Pixels, der ü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.
    Dieser Parameter existiert erst seit FreeBASIC v0.17. In älteren Versionen konnte kein Parameter übergeben werden.
  • 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.

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 BefehlsreferenzeintragIMAGECONVERTROW 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:

zu früheren FreeBASIC-Versionen:

Siehe auch:
BefehlsreferenzeintragPUT (Datei), BefehlsreferenzeintragGET (Grafik), BefehlsreferenzeintragIMAGECREATE, BefehlsreferenzeintragSCREEN (Anweisung), BefehlsreferenzeintragInterne Pixelformate


Zusätzliche Informationen und Funktionen
  • Der Referenzeintrag wurde am 08.08.2007 von Redakteurnemored angelegt.
  • Die aktuellste Version wurde am 24.03.2010 von RedakteurVolta gespeichert.
  Versionen Versionen