Buchempfehlung
Windows-Programmierung. Das Entwicklerhandbuch zur WIN32-API
Windows-Programmierung. Das Entwicklerhandbuch zur WIN32-API
"Der" Petzold, das über 1000 Seiten starke Standardwerk zum Win32-API - besonders nützlich u. a. bei der GUI-Programmierung in FreeBASIC! [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Referenz - PUT (Grafik)

Referenz-Navigation

 

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 BefehlsreferenzeintragGET (Grafik) verwendet wird.

Die Koordinaten sind abhängig von den letzten BefehlsreferenzeintragVIEW- und BefehlsreferenzeintragWINDOW-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.

AktionswortInteraktion der Pixel
PSETDas gespeicherte Pixel überschreibt das Pixel auf dem Bildschirm.
Mit diesem Aktionswort wird also tatsächlich der Bildschirmausschnitt ausgegeben, der im Puffer gespeichert wurde.
PRESETDie 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.
ANDAuf dem Bildschirm wird ein Pixel ausgegeben, dessen Farbnummer das Ergebnis eines logischen BefehlsreferenzeintragAND mit dem Pixel auf dem Bildschirm und dem im Puffer gespeicherten Pixel ist.
ORAuf dem Bildschirm wird ein Pixel ausgegeben, dessen Farbnummer das Ergebnis eines logischen BefehlsreferenzeintragOR mit dem Pixel auf dem Bildschirm und dem im Puffer gespeicherten Pixel ist.
XORAuf dem Bildschirm wird ein Pixel ausgegeben, dessen Farbnummer das Ergebnis eines logischen BefehlsreferenzeintragXOR mit dem Pixel auf dem Bildschirm und dem im Puffer gespeicherten Pixel ist.
XOR ist das Standard-Aktionswort.
TRANSDie 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 BefehlsreferenzeintragInterne 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 BefehlsreferenzeintragFunktion 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 BefehlsreferenzeintragOR 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 BefehlsreferenzeintragSCREENRES ä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 BefehlsreferenzeintragIMAGECONVERTROW 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:

Unterschiede zu früheren Versionen von FreeBASIC:

Siehe auch:
BefehlsreferenzeintragPUT (Datei), BefehlsreferenzeintragGET (Grafik), BefehlsreferenzeintragIMAGECREATE, BefehlsreferenzeintragSCREENRES, BefehlsreferenzeintragInterne Pixelformate, BefehlsreferenzeintragGrafik


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