画面全体を拡大縮小するには

◆PROCESSING 逆引きリファレンス

 カテゴリー:イメージ処理

画面全体を拡大縮小するには

【概要】

PROCESSINGは scale()命令を利用すると、画面全体の描画サイズを変更することが可能です。つまり scale()命令を利用すれば、結果として画面全体の拡大縮小を行うことが可能となります。

画面全体の拡大縮小処理は、以下のようなケースでも有効活用できます。

PROCESSINGには画面全体に対して画像加工を行う(ボカシやフィルターなどをかける)命令がいくつか存在しますが、これらの処理は1つ1つの画素に対して演算を行うため、どうしても重たい処理になります。

そこで十分に小さな画面領域に対して画像描画と加工を行い、それを画面全体に拡大表示するのです。こうする事で、画面全体に対して画像加工を行う時に比べ、高速に表示を行うことができるようになります。

ただし(特に)画面の拡大処理は、結果として描画内容が荒くなる事になりますので、精細な表示な求められるような場面には不向きです。そこは注意してください。

 

【詳細】

描画サイズを変更する

描画サイズを変更するvoid scale( float scalePercent );
void scale( float xPercent, float yPercent );
void scale( float xPercent, float yPercent, float zPercent );

scalePercent:画面全体の縮小率
xPercent:横方向の縮小率
yPercent:縦方向の縮小率
zPercent:奥行への縮小率(P3D利用時)

scale()命令は draw() 関数の中で利用します。

<出力結果>

例えば上記を実行すると、このような絵が描画されます。

赤い四角形は普通に描画したもので、縦横100ピクセルの四角形が画面中央に描かれます。

青い四角形は scale()命令で縮率を50%にしたものなので、同じサイズで描画しても赤い四角形の半分の大きさ(面積比1/4)で描かれています。また線幅も赤い四角形に比べて半分(線幅2)になっている事にも注意してください。

scale()命令で変更した縮小率は、draw()ループを抜けると初期化されます。

なので

とすると、以降は元画像の1/2の1/2、つまり元画像の1/4(25%)の縮小率で描画されることになります。

縮小率は縦横別々に指定する事も可能です。例えば先ほどのサンプルで scale()命令を使っている箇所を

上記のように変更すると

このような描画になります。横方向だけ縮小率が50%になったので、青い四角形が縦長になりました。

 

応用例

これを応用すると、マウスクリックなどで画像を拡大縮小する事ができるようになります。

上記例を実行すると、画面中央にキャラクターの絵が表示されます。

(画像URL:illust-AC 様:Kamesanさん、acworksさん)

マウスホイールを奥に向かって回すと画像が縮小、手前に向かって回すと拡大されます。

と書かれた部分を解説します。

基本的には imageMode()命令で画像の描画原点を画像を囲む矩形の中央にし、それを image() 命令で画面中央に表示しています。

ただ普通に

とすると、描画領域を元画像(100%表示)の半分の大きさに縮小した場合、図のAにあった中心点がBの位置になってしまいます。
そこで拡大縮小率に応じて、画像の中心点(描画原点)を、常に画面の中央になるように補正します。

たとえば縮率50%なら、width/2(A) が width/4(B) になっているので、これを2倍する事で元の位置(A)に補正するわけです。

 

【関連記事】

  • なし

 


サンプルプログラム

画像加工高速表示例:

上記を実行すると、小さな元画像(214✕320)に対して画像加工(ぼかし)を実行し、それを引き伸ばして、大きな画面(1900✕1000)に表示します。

画面全体(1900✕1000)に画像加工を行うのに比べて、結果をかなり高速に表示できます。ただし加工後の画像は引き伸ばして表示されているので、品質が低下しています。


(画像URL:illust-ACphoto-AC 様:acworksさん)

画像サイズを小さくすれば、より高速に表示できますが、より品質は低下します。

<出力サンプル>

(画像URL:illust-ACphoto-AC 様:acworksさん)

 


PROCESSING逆引きリファレンス一覧 へ戻る

本ページで利用しているアイコン画像は、下記サイト様より拝借しております。各画像の著作権は、それぞれのサイト様および作者にあります。