現在作業中のページか、画像バッファの、一部のコピーを取得します。
構文:
Get [source,] [STEP](x1, y1) - [STEP](x2, y2), dest
パラメタ:
source
画像バッファのアドレス。省略した場合は、現在の作業ページがコピーされます。
STEP
以下の座標が、絶対座標でないことを示します。
[STEP](x1, y1)
コピーするサブ画像の左上角の座標です。
STEP は、オフセット (x1, y1) が、現在の描画カーソル位置からの相対位置であることを示します。
[STEP](x2, y2)
コピーするサブ画像の右下角の座標です。
STEP は、オフセット x2 と y2 が、x1 と y1 からの相対位置であることを示します。
dest
画像データを格納するために、前もって割り当てたバッファのアドレス。
説明:
Get は、座標 (
x1,
y1) と (
x2,
y2)によって指定された現在の作業中のページの長方形の部分を、コピーします。座標 (
x1,
y1) と (
x2,
y2)は、それぞれ、長方形の左上と右下の角を表します。
Step は、左上の座標が、現在の描画ペン位置からの相対位置であることを示しています。右下の座標は、左上の座標からの相対位置になります。
新しい画像バッファは、現在の画面モードの
pixel format に合わせるために、フォーマットされます。
dest は、アドレスや、
array(名前は後ろに空のカッコを付けない)や、新しいイメージバッファを受け取る
array 内の最初の要素への参照、になることができます。
このメモリーは、画像バッファーを保持するために十分な量を割り当てなければなりません(必要なバイト数は、プログラムのコンパイルに使う
-lang dialect によって異なります)。
有効な画像バッファは、
ImageCreate 文を使うだけで簡単に作成できます。
source は、アドレス、
array、または、部分を検索する画像バッファを保持する
array の最初の要素の参照です。
x1,
y1,
x2,
y2,
Step および
dest は、この場合、同じ意味です。
長方形の座標は、最新の
WINDOW と
View (描画) 命令文の影響を受けます。そして、
View (描画)による、現在の切り取り領域セットの中になります(またはデフォルトのビューポート内)。そうでないと、不法な関数呼び出しランタイム・エラーになります。そして、関数は無効になります。
Runtime errors(ランタイム・エラー):
(1) Illegal function call
- dest は、配列ですが、画像バッファを保持するほど大きくはありません。
- 長方形の左上か右下の座標が、現在の切り取り領域の外にあります。(設定またはデフォルト)
View (Graphics) を参照下さい。
方言差:
-
-lang qb と -lang fblite 方言で、dest は、QB-スタイルイ画像バッファを受け取ります。QB-スタイルイ画像バッファは、4バイトのイメージヘッダーと、それに続く列詰めされていないピクセルデータから構成されています。
下の式を使って、画像バッファを格納する総サイズを、バイト数で、計算できます。ここで、w と h は、幅と高さで、現在、作業中のページか、ソース画像バッファの、長方形の部分の、幅と高さです。bpp は、現在の画像モードの、画素あたりのバイト数です。:
size = 4 + (w * h * bpp)
例:
注:FreeBASIC 1.08〜 で、SetEnviron を追加しなくても、日本語環境で描画画面が表示されるように改善されました。
#include once
"fbgfx.bi"
' Sets the graphics method GDI
' 描画方法を GDI に設定
SetEnviron("fbgfx=GDI")
'' 400x300 32bit 画面を設定します
ScreenRes 400,
300,
32
'' 最初にいいものを描きます...
Line (10,
10)-
(140,
30),
RGB(255,
255,
0), bf
Draw String (30,
20),
"Hello there!",
RGB(255,
0,
0)
'' 画面の左上から 150x50 のブロックを、
'' GET を使って、画像バッファに、取得します...
Dim As fb.Image
Ptr image =
ImageCreate(150,
50)
Get (0,
0)-
(150-
1,
50-
1), image
'' そして、これを、いたる所で繰り返します!
Put (0,
50), image
Put (0,
100), image
Put (0,
150), image
Put (0,
200), image
Put (0,
250), image
Put (150,
0), image
Put (150,
50), image
Put (150,
100), image
Put (150,
150), image
Put (150,
200), image
Put (150,
250), image
ImageDestroy(image
)
'' そして、全画面のあたりのフレーム..
Line (0,
0)-
(400-
1,
300-
1),
RGB(255,
255,
0), b
'' ここで全画面を取得します...
Dim As fb.Image
Ptr big =
ImageCreate(400,
300)
Get (0,
0)-
(400-
1,
300-
1), big
'' そして、この "screenshot" を表示します。まるで映像がスクロールしているように...
Dim As Integer x = -
350
While ((Inkey() =
"") And (x <
350))
ScreenLock
Cls
Put (x,
0), big
ScreenUnlock
Sleep 100,
1
x +=
10
Wend
ImageDestroy(big
)
以下は、
QB64 http://www.qb64.net/ の
サンプル・フォルダにあるプログラムを、FreeBASIC 用に微修正したものです。
QB64\programs\samples\misc\twirl2.bas
参考: