AlphaImageDemo

呈示した画像を、ガウスフィルターを通して見るプログラムです。

if ix>wW | iy>wH

ixは画像の幅で、wWはウィンドウ(スクリーン)の幅です。つまり、画像のサイズがスクリーンを越えていたら、という意味になります。超えていた場合は、スクリーンのサイズと同じになるように画像が切り取られます。

clは、画像の中心とスクリーンの中心を合わせたときに、左側にできる画像の超過サイズです。同様に、crは右側の、ctは上側の、cbは下側の超過サイズで、この超過した画像領域は画面に呈示されません。

imagetex=Screen('MakeTexture', w, imdata(1+ct:iy-cb, 1+cl:ix-cr,:));

imdataは、行については1からiyまでデータがあるのですが、画像のサイズがスクリーンを越えていた場合はctおよびcbが正の数になり、一部分だけが呈示されます。列については、1からixまでデータがあります。

tRect=Screen('Rect', imagetex)

画像の情報がテクスチャに変換されたimagetexの四角形がtRectです。tRectは、画像を四角形として扱うことを可能にします。例えば、RectWidth(tRect)とすると画像の幅の情報が分かったりして便利になります。

[ctRect, dx, dy]=CenterRect(tRect, wRect)

画像(tRect)をスクリーン(wRect)の中央に配置します。tRectを中央に移動させるには水平方向にdx、垂直方向にdyだけ移動させることになります。またctRectはスクリーンの左上を (0, 0) としたときの、画像を表す四角形になります。

maskblob=uint8(ones(2*ms+1, 2*ms+1, transLayer) * gray);

ms=100の場合、201行×201列の行列がtransLayerの数=2個できます。便宜的にこれをA、Bと呼びます。ここではAとBの値がgray(背景色)になりますが、

maskblob(:,:,transLayer)=uint8(round(255 - exp(-((x/xsd).^2)-((y/ysd).^2))*255));

によって、Bの値に、中心部分が0(透明)で周辺に行くほど255(不透明)に近づくようなガウス分布の値が代入されます。AとBが組み合わされることで、maskbrobの中心部分だけが透過的に見えるようになります。

if (mx~=mxold | my~=myold)

カーソルの位置が動いたときだけ、if文の中身を実行します。

myrect=[mx-ms my-ms mx+ms+1 my+ms+1]

カーソルの位置 (mx, my) を中心に、ガウスフィルターがかかる範囲の四角形領域が、myrectになります。座標の値は、スクリーンの左上を (0, 0) としていることに注意してください。

dRect = ClipRect(myrect,ctRect);

画像(ctRect)とフィルターをかける四角形(myrect)が重なっている部分がdRectです。基本的にはmyrect=dRectなのですが、画像の端の部分では myrect > dRect になります。

sRect=OffsetRect(dRect, -dx, -dy);

dRectの座標は、スクリーンの左上を (0, 0) としているのですが、sRectは画像の左上の座標を (0, 0) としたときの、dRectの座標になります。