5.拡大縮小


『すでに使っていた拡大縮小』

 前章で画像ファイルを画面に描画しましたが、微妙に高度な描画をしています。良く見れば気づく事なのですが、画像ファイルを画面全体にぴったり描画されるように拡大されています。それも縦と横の拡大率を個別に調整して綺麗に画面内に収まるようになっているはずです。
これはコピーの仕様が「コピー元の指定矩形範囲をコピー先の指定矩形範囲にコピーする」としているためです。
 矩形範囲とは、正四角形の囲んだ範囲で同四角形の左上と右下の座標を指定した領域を示します。正四角形なので左上と右下の座標を指定すれば自ずと左下と右下の座標は決まるので、左上と右下の座標だけで指定できるのです。例えば320×120(横×縦)の画像を300×240の画面にコピーする場合、縦を2倍に拡大してコピーします。
 この矩形範囲はG@CHRRECT関数で指定するのですが、G@CHRLOADで読み込んだ直後や画面を初期化した直後のキャラクタの矩形範囲はそれぞれ読み込んだ画像のサイズまたは画面のサイズとなります。
 例えば200×100の画像を読み込んだ直後の矩形範囲の初期値は左上が X座標0,Y座標0で、右下が X座標199,Y座標99となります。右下の値が半端に見えますが、これは左上の座標が0からはじまるからです。
 この仕様により色々な特殊効果を実現できます。まずコピー元の矩形範囲を変更する事でコピー元の一部分を描画する事が出来ます。またコピー先の矩形範囲を変更する事で、拡大縮小が出来ます。
 拡大縮小のアドバイスですが、コピー元とコピー先の矩形サイズを同じにすれば当倍の描画となり、コピー元よりもコピー先の矩形サイズが大きい場合は拡大描画となります。逆にコピー先よりもコピー元の矩形サイズが大きい場合は縮小描画となります。
なお、当倍に描画する方法としてG@CHRCOPYF関数を使用する方法もあります。

『使ってみる』

例えば、前章のサンプルプログラムで画像を画面の指定した矩形範囲(左100、上200、右300、下400)に描画してみます。

CH = G@SETUP( 640 , 480 , 16 , 1 )      //画面初期化
BM = G@CHRLOAD( "TEST.BMP" )            //画像読み込み
G@CHRRECT( CH , 100 , 200 , 300 , 400 ) //コピー先の矩形範囲を指定
G@CHRCOPY( BM , CH )                    //画像を画面にコピー
G@FLIP( )                               //フリップ
LOOP
  S@WAIT( )                             //システムウェイト
ENDLOOP

<<プログラム&テスト画像のダウンロード>>

コピー先の矩形を変えることで、コピー元の画像を自由に拡大縮小できることができることがわかります。
こんどは、コピー元の指定した範囲(左50、上70、右150、下110)を画面全体に表示してみます。

CH = G@SETUP( 640 , 480 , 16 , 1 )      //画面初期化
BM = G@CHRLOAD( "TEST.BMP" )            //画像読み込み
G@CHRRECT( BM , 50 , 70 , 150 , 110 )    //コピー元の矩形範囲を指定
G@CHRCOPY( BM , CH )                    //画像を画面にコピー
G@FLIP( )                               //フリップ
LOOP
  S@WAIT( )                             //システムウェイト
ENDLOOP

<<プログラム&テスト画像のダウンロード>>

どうですか、簡単に画像の拡大縮小ができるでしょ?コピー元とコピー先の矩形範囲を同時に変えることで面白い効果も期待できます。また、コピー元の矩形範囲を変えることで、拡大縮小以外にも好きな範囲をコピーするという効果あります。ここらへんは色々試して技をあみ出してみてください。