画像を、別の画像か、画面に、コピーします。
構文:
Put [ target, ] [ STEP ] ( x,y ), source [ ,( x1,y1 )-[ STEP ]( x2,y2 ) ]
[ ,method [ ,( alphaval|value|blender [ ,param]) ] ]
パラメタ:
target
target は、画像を描くためのバッファのアドレスです。
省略すると、画像は画面にビットマップ転送されます。下を見てください。
[STEP]
(x, y) オフセットが、現在の描画カーソル位置からの相対位置になることを示します。
(x, y)
(x, y) は、画像を描くための、目的バッファ、または画面の、左上隅からの座標を指定します。
source
source は、画像を描くためのバッファのアドレスです。
下を見てください。
(x1, y1)-[ STEP ]
(x2, y2)
描くための、ソース・バッファに、長方形エリアを指定します。
省略すると、バッファ全体が、描かれます。
STEP を付けると、 x2 と y2 が、それぞれ x1 と y1 からの相対位置になることを示します。
method
method は、目的バッファに、画像を描くために使う方法を指定します。これは、以下のいずれかを選択します(デフォルト方法は XOR です):
背景から独立している方法
PSET :
ソース画素値は、変更なしでコピーされます。
PRESET :
ソース画素値は、コピーされる前に、否定して1の補数をとります。
TRANS :
ソース画素値は、変更なしでコピーされます。
マスク色のソース画素を描きません。下を見てください。
背景に依存する方法
AND (Graphics Put) :
あて先の画素は、元の画素と、ビット単位で AND されます。
下を見てください。
OR :
あて先の画素は、元の画素と、ビット単位で OR されます。
下を見てください。
XOR :
あて先の画素は、元の画素と、ビット単位で XOR されます。
下を見てください。
ALPHA :
元の画素は、指定された
value パラメタ、または画像の個々の画素で、透明要素と、混合されます。
下を見てください。
ADD:
元の画素は、値が掛けられて、あて先の画素に、彩度とともに、加えられます。
下を見てください。
CUSTOM :
元の画素を、あて先の画素を混合するのに、ユーザ定義関数を使用します。
下を見てください。
value
value は、0〜255 の範囲の値で、ADD や ALPHA 法でビットマップ転送するための、透明値を指定します。
blender
blender は、CUSTOM 法のビットマップ転送で呼び出すユーザ定義関数の、アドレスを、指定します。下を見てください。
param
param は、カスタム混合に渡すパラメタを、指定します。
説明:
Put 命令文は、画像を、別の画像または画面の上に描くために使います。
x と
y 座標は、
View と
WINDOW 命令文の最後の呼び出しの影響を受けます。そして、点描された画像は、
View 命令文の最後の呼び出しで設定された、現在の切り取り領域になります。
元になる画像が、宛先のバッファや画面より大きい可能性があります(コピーされた画像は、宛先の大きさに応じて、切り捨てられます)。
有効な画像バッファ
source と
target の画像バッファは、有効な画像バッファでなければなりません。
有効な画像バッファは、
Get か
ImageCreate 命令文を使って、作成されます。
有効な画像バッファは、
Put 命令文で、オプションの索引付きの配列名(括弧は空ではない)、またはオプションの索引付きポインターを使って、指定できます。
描画操作命令
使用される操作命令によって、あて先バッファの既存のピクセル値は、実際に描かれるピクセル値を計算するために使用されます。
PSET, PRESET と TRANS 操作命令は、最終的なピクセル値を計算するのに、あて先バッファを使用しません。AND, OR, XOR, ALPHA と ADD 操作命令は、あて先バッファを使用します。
後者の方法で描かれる画像は、あて先バッファの中身と異なっているように見えます。
異なったピクセル形式
画像バッファのピクセル形式は、現在の描画モード色の濃さと互換性があります。
すなわち、
Get を使って、画像を取得して、後で
Screen (描画) 命令文で画面モードを変えるなら、画像データは、新しい描画モードで無効になります。そして、それを画面に描くことは、できません。
しかし、バッファが同じ色深度で作成された限り、Putを通して、画像バッファを、いつも他の画像バッファに、描くことができることに、注意して下さい。
AND,
OR と
XOR 操作命令は、現在の色の濃さによって、異なった結果になります。それは、画素が、異なった形式で格納されているためです。
詳細は、
内部の描画形式 を見てください。
マスク色
TRANS,
ALPHA と
ADD 操作命令は、マスク色を使用する元の画像に、画素を描きません。
マスク色は、目標(画像バッファか、画面)の色深度に依存します。:
8bpp(パレット・モード)までの色深度では、色インデックスの
0 と同じです。hi/true カラー深度(16 と 32 bpp)では、マゼンタ(赤紫色)と等しくなります。それは、
RGB(255, 0, 255)です。
32bppモードで、色のアルファ値が、透明色の識別に影響しないことに注意してください。
24ビットより小さい場合だけ、それを特定するのに使用されます。
詳細は、
内部の描画形式 を見てください。
アルファ描画
アルファー操作命令は、2つのモードで、使えます。
value のパラメタを指定すると、これは、描かれる画像全体の、透明のレベルを指定するために使われます。
0の値は、完全に透視画像を描きます。値を255にすると、完全に不透明のものを描きます。
hi/true カラーの目標 (16 と 32 bpp) に描くときだけ、このモードは機能します。
value のパラメタを省略すると、ALPHA 操作命令は、1画素単位を基本にして、アルファ・レベルの値を取ります。そしてアルファ・チャンネルで、画像を描くことを許容します。(画像のある部分を、他の部分より、多く、あるいは少く透明にすることができます)。
このモードは、32bpp の画像バッファだけで働きます。これは、32bpp が、各画素に埋め込まれたアルファ値を許容する、唯一の色の濃さだからです。
アルファ・チャンネルの取り扱い
通常、 Put は、同じ深さの目標にだけ、画像バッファを描くことを許容しますが、例外があります。
8bpp画像バッファを、32bppの目標に描くとき、ALPHA 法が使われます。8bppの元になる画像は、32bppの目標の、アルファ・チャンネルに描かれます。
これは、簡単に、画像のアルファ・チャンネルの全体を設定できるので、ピクセル・データの、低レベルのアクセスに対処する必要はありません。
カスタム混合関数
CUSTOM メソッド(オブジェクトへの操作命令)は、あて先バッファに描く、最終的なピクセル値を計算するのに、ユーザ定義関数を使用します。
この関数は、元になる画像のあらゆる画素のために一度呼ばれて、元のピクセル値と、あて先のピクセル値を受け取ります。そして、 Put 関数によって、データポインタが渡されます。
戻り値の画素の値は、あて先バッファに描くために使われる値になります。
関数は、下の形式です。:
identifier は、関数の名前です。
好きに設定できます。
source_pixel は、元になる画像の、現在のピクセル値です。
destination_pixel は、あて先になる画像の、現在のピクセル値です。
parameter は、
Put 命令で引き渡すパラメタです。
それは、データ
Pointer です。
省略すると、値はゼロになります。
例:
下のプログラムは、画面に画像を
Put する方法、画像バッファを設定する方法、そして、最後に、そのメモリを解放する方法、の簡単な例です。
注:FreeBASIC 1.08〜 で、SetEnviron を追加しなくても、日本語環境で描画画面が表示されるように改善されました。
' Sets the graphics method GDI
' 描画方法を GDI に設定
SetEnviron("fbgfx=GDI")
'' 画面をセットアップして、背景を塗りつぶします
ScreenRes 320,
200,
32
Paint (0,
0),
RGB
(64,
128,
255)
'' 画像をセットアップして、その中に、何かを描きます
Dim img
As Any Ptr =
ImageCreate
( 32,
32,
RGB(255,
0,
255) )
Circle img,
(16,
16),
15,
RGB(255,
255,
0), , ,
1, f
Circle img,
(10,
10),
3,
RGB( 0,
0,
0), , ,
2, f
Circle img,
(23,
10),
3,
RGB( 0,
0,
0), , ,
2, f
Circle img,
(16,
18),
10,
RGB( 0,
0,
0),
3.
14,
6.
28
'' 画面の中央に画像を置きます
Put (160 -
16,
100 -
16), img,
Trans
'' 画像メモリを解放します
ImageDestroy img
'' キー操作を待ちます
Sleep
下の例は、画像にメモリを割り当て、カスタム混合を含むさまざまな方法を使ってその画像を描画し、画像のメモリを解放する方法を示しています:
' Sets the graphics method GDI
' 描画方法を GDI に設定
SetEnviron("fbgfx=GDI")
Declare Function checkered_blend
( ByVal src
As Ulong,
ByVal dest
As Ulong,
ByVal param
As Any Ptr ) As Ulong
Screen 14,
32 '' set 320*240*32 gfx mode
Dim As Any Ptr sprite
Dim As Integer counter =
0
sprite =
ImageCreate( 32,
32 ) '' allocate memory for 32x32 sprite
Line sprite,
( 0,
0 )-
( 31,
31 ),
RGBA(255,
0,
0,
64), bf
'' draw a sprite ...
Line sprite,
( 4,
4 )-
( 27,
27 ),
RGBA(255,
0,
0,
192), bf
Line sprite,
( 0,
0 )-
( 31,
31 ),
RGB(0,
255,
0), b
Line sprite,
( 8,
8 )-
( 23,
23 ),
RGBA(255,
0,
255,
64), bf
Line sprite,
( 1,
1 )-
( 30,
30 ),
RGBA
(0,
0,
255,
192)
Line sprite,
( 30,
1 )-
( 1,
30 ),
RGBA
(0,
0,
255,
192)
Cls
Dim As Integer i :
For i =
0 To 63 '' draw the background
Line( i,
0 )-
( i,
240 ),
RGB
( i *
4, i *
4, i *
4 )
Next i
'' すべての描画法を示します ...
Put( 8,
14 ), sprite,
PSet
Put Step( 16,
20 ), sprite,
PReset
Put Step( -
16,
20 ), sprite,
And
Put Step( 16,
20 ), sprite,
Or
Put Step( -
16,
20 ), sprite,
Xor
Put Step( 16,
20 ), sprite,
Trans
Put Step( -
16,
20 ), sprite,
Alpha,
96
Put Step( 16,
20 ), sprite,
Alpha
Put Step( -
16,
20 ), sprite, add,
192
Put Step( 16,
20 ), sprite,
Custom, @checkered_blend, @counter
'' 各デモの近くに、内容を表示します
Draw String (100,
26),
"<- pset"
Draw String Step (0,
20),
"<- preset"
Draw String Step (0,
20),
"<- and"
Draw String Step (0,
20),
"<- or"
Draw String Step (0,
20),
"<- xor"
Draw String Step (0,
20),
"<- trans"
Draw String Step (0,
20),
"<- alpha (uniform)"
Draw String Step (0,
20),
"<- alpha (per pixel)"
Draw String Step (0,
20),
"<- add"
Draw String Step (0,
20),
"<- custom"
ImageDestroy( sprite
) '' スプライトのために割り当てたメモリを解放します
Sleep :
End 0
'' カスタム混合関数:色とりどりの put
Function checkered_blend
( ByVal src
As Ulong,
ByVal dest
As Ulong,
ByVal param
As Any Ptr ) As Ulong
Dim As Integer Ptr counter
Dim As ULong pixel
counter =
Cast
(Integer Ptr, param
)
pixel =
IIf
(((*counter
And 4) Shr 2) Xor ((*counter
And 128) Shr 7), src, dest
)
*
counter +=
1
Return pixel
End Function
QB との違い:
- target は、FreeBASIC で追加されました。
-
TRANS, ALPHA, ADD および CUSTOM 方法は、FreeBASIC の新機能です。
- FBは内部的に異なる画像形式を使います。これは QB でサポートされません。
- QBは、区域外の画像を切り取ることはできなくて、ランタイム・エラーを表示します。
- QBでは、ソース画像として配列しか指定できません。
参照: