FreeBASIC マニュアルのトップに戻る

FreeBASIC Putgraphics

目次→描画ライブラリ参考→2次元 描画関数PUT (GRAPHICS)←オリジナル・サイト

PUT (描画) 左にメニュー・フレームが表示されていない場合は、ここをクリックして下さい

←リンク元に戻る プログラム開発関連に戻る

画像を、別の画像か、画面に、コピーします。


構文:
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 を付けると、 x2y2 が、それぞれ x1y1 からの相対位置になることを示します。
method
method は、目的バッファに、画像を描くために使う方法を指定します。これは、以下のいずれかを選択します(デフォルト方法は XOR です):

背景から独立している方法

PSET : ソース画素値は、変更なしでコピーされます。
PRESET : ソース画素値は、コピーされる前に、否定して1の補数をとります。
TRANS : ソース画素値は、変更なしでコピーされます。
マスク色のソース画素を描きません。下を見てください。

背景に依存する方法

AND (Graphics Put) : あて先の画素は、元の画素と、ビット単位で AND されます。 下を見てください。
OR : あて先の画素は、元の画素と、ビット単位で OR されます。 下を見てください。
XOR : あて先の画素は、元の画素と、ビット単位で XOR されます。 下を見てください。
ALPHA : 元の画素は、指定された value パラメタ、または画像の個々の画素で、透明要素と、混合されます。 下を見てください。
ADD: 元の画素は、値が掛けられて、あて先の画素に、彩度とともに、加えられます。 下を見てください。
CUSTOM : 元の画素を、あて先の画素を混合するのに、ユーザ定義関数を使用します。 下を見てください。

value
value は、0〜255 の範囲の値で、ADDALPHA 法でビットマップ転送するための、透明値を指定します。
blender
blender は、CUSTOM 法のビットマップ転送で呼び出すユーザ定義関数の、アドレスを、指定します。下を見てください。
param
param は、カスタム混合に渡すパラメタを、指定します。

説明:
 Put 命令文は、画像を、別の画像または画面の上に描くために使います。
 xy 座標は、ViewWINDOW 命令文の最後の呼び出しの影響を受けます。そして、点描された画像は、View 命令文の最後の呼び出しで設定された、現在の切り取り領域になります。
 元になる画像が、宛先のバッファや画面より大きい可能性があります(コピーされた画像は、宛先の大きさに応じて、切り捨てられます)。

有効な画像バッファ
 sourcetarget の画像バッファは、有効な画像バッファでなければなりません。
 有効な画像バッファは、GetImageCreate 命令文を使って、作成されます。
 有効な画像バッファは、Put 命令文で、オプションの索引付きの配列名(括弧は空ではない)、またはオプションの索引付きポインターを使って、指定できます。

描画操作命令
 使用される操作命令によって、あて先バッファの既存のピクセル値は、実際に描かれるピクセル値を計算するために使用されます。
 PSET, PRESETTRANS 操作命令は、最終的なピクセル値を計算するのに、あて先バッファを使用しません。AND, OR, XOR, ALPHAADD 操作命令は、あて先バッファを使用します。
 後者の方法で描かれる画像は、あて先バッファの中身と異なっているように見えます。

異なったピクセル形式
 画像バッファのピクセル形式は、現在の描画モード色の濃さと互換性があります。
 すなわち、Get を使って、画像を取得して、後で Screen (描画) 命令文で画面モードを変えるなら、画像データは、新しい描画モードで無効になります。そして、それを画面に描くことは、できません。
 しかし、バッファが同じ色深度で作成された限り、Putを通して、画像バッファを、いつも他の画像バッファに、描くことができることに、注意して下さい。

 AND, ORXOR 操作命令は、現在の色の濃さによって、異なった結果になります。それは、画素が、異なった形式で格納されているためです。
 詳細は、内部の描画形式 を見てください。

マスク色
 TRANS, ALPHAADD 操作命令は、マスク色を使用する元の画像に、画素を描きません。
 マスク色は、目標(画像バッファか、画面)の色深度に依存します。:
 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 関数によって、データポインタが渡されます。
 戻り値の画素の値は、あて先バッファに描くために使われる値になります。
 関数は、下の形式です。:

declare function identifier ( byval source_pixel as Ulong ,byval destination_pixel as Ulong ,byval parameter as any PTR) as Ulong

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), 3RGB(  0,   0, 0),     ,     , 2, f
Circle img, (23, 10), 3RGB(  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 との違い:

参照:

2次元描画関数に戻る

←リンク元に戻る プログラム開発関連に戻る

ページ歴史:2023-07-09 02:20:36
日本語翻訳:WATANABE Makoto、原文著作者:SysOp

ホームページのトップに戻る

表示-非営利-継承