画像を自由に変形するプログラムを作ってみた。変形の処理にはgsquareを使用。
これを応用すればPhotoshopのパペットワープ、ゲーム画面の切替効果等に使えると思う。
ただ、問題は処理速度。グリット数を増やすとどうしても処理が遅くなってしまう。
画像編集ソフト的な目的なら遅くても問題はないと思う。
ただゲーム等に組み込むとなると最低40fps(カクツキが目立たない限度)、できれば60fpsは欲しい。
そしてgsquareの欠点は処理速度以外に画質の問題がある。大きく変形させるとガクガクに。
拡大した画像を変形→縮小である程度抑えられるが、今ですら遅いのに更に遅くなる・・・
どなたか、暇な時でいいので処理速度と画質、この2つの改善策を提案して頂けると嬉しいです。
(i7260(4コア8スレッド)、GTX760、RAM160、使用画像1280x1024、グリッド数16*16でほぼ60)
#include"d3m.hsp"
グリッドx2=10:グリッドy2=10//グリッド数
Screen 2,200,200
pos 50,5:input グリッドx2,50,20,2
pos 50,30:input グリッドy2,50,20,2
pos 50,50:button gosub"読み込み",*処理始め
pos 50,80:button gosub"初期化",*初期化
pos 0,5:mes "グリッドx"
pos 0,30:mes "グリッドy"
stop
*処理始め
Dialog "jpg\npng\bmp\ngif\njpeg\nico\nnpsd\ntga",16,"画像を選択"
if stat=0:end
Buffer 1
picload refstr
winx=ginfo_winx
winy=ginfo_winy
gosub*初期化
Screen 0,winx,winy
repeat
getkey k,1
mx=mousex:my=mousey
redraw 0
Color 255,255,255:boxf:Color 0,0,0
repeat グリッドx+1
ct=cnt
repeat グリッドy+1
if グリッドx!ct&グリッドy!cnt:{
先x=座標x.ct.cnt,座標x.(ct+1).cnt,座標x.(ct+1).(cnt+1),座標x.ct.(cnt+1)
先y=座標y.ct.cnt,座標y.(ct+1).cnt,座標y.(ct+1).(cnt+1),座標y.ct.(cnt+1)
元x=onemx*ct,onemx*(ct+1),onemx*(ct+1),onemx*(ct)
元y=onemy*cnt,onemy*cnt,onemy*(cnt+1),onemy*(cnt+1)
gsquare 1,先x,先y,元x,元y
}
pos 座標x.ct.cnt-8,座標y.ct.cnt-8:mes "●"
if k=1&kbac=0 & 座標x.ct.cnt-判定x<mx & 座標y.ct.cnt-判定y<my &座標x.ct.cnt+判定x>mx &座標y.ct.cnt+判定y>my:選択x=ct:選択y=cnt:フラグ=1
loop
loop
redraw 1
if フラグ=1:座標x.選択x.選択y=mx:座標y.選択x.選択y=my
if k=0&kbac=1:フラグ=0
kbac=k
title ""+d3getfps()+"fps"
await
if グリッドx!グリッドx2 or グリッドy!グリッドy2 & グリッドx2!0 &グリッドy2!0:gosub*初期化
loop
*初期化
グリッドx=グリッドx2
グリッドy=グリッドy2
onemx=int(double(winx)/double(グリッドx))
onemy=int(double(winy)/double(グリッドy))
判定x=16
判定y=16
dim 座標x,999,999
dim 座標y,グリッドx+1,グリッドy+1
dim 先x,4
dim 先y,4
dim 元x,4
dim 元y,4
repeat グリッドx+1
ct=cnt
repeat グリッドy+1
座標x.ct.cnt=ct*onemx
座標y.ct.cnt=cnt*onemy
loop
loop
return