簡単な方法としては
読み込んだ画像を、白背景に黒透過でコピーして、そこに色減算合成コピーを重ねて
黒抜き画像を作って、それを白背景に色減算コピーして白抜き画像にする
画像の横2倍でウィンドウバッファを用意
左側を縁の色で塗りつぶす(この時boxfを使うと1ドット余分になるので注意)
右側を黒で塗りつぶす
左側に元画像を黒透過でコピー
白抜き画像をgmode7のアルファブレンド成分用として右側に黒透過でコピー
この時に縦横にずらしてコピーしとけば
左側の画像の周囲を縁として利用できる
元画像サイズでgmode7のコピーをすれば縁取り済み画像の完成
黒(各色0)以外を縁取りするモジュール
#module
//[ edgepic size, type ]
// size : 縁のサイズ
// mode : 縁を作るモード「0=一番外側の縁の角を描画しない、1=一番外側の縁の角も描画する」
#deffunc edgepic int size,int mode
sel=ginfo_sel
rgb=(ginfo_r<<16) | (ginfo_g<<8) | ginfo_b
w=ginfo_winx
h=ginfo_winy
buffer 100,w,h,0 //画像の形に黒抜きする作業用バッファ
gmode 2
gcopy sel,0,0,w,h //白背景に黒透過コピー
gmode 6,0,0,256
gcopy sel,0,0,w,h //色減算コピーして上でコピーした画像を黒くする(黒抜き画像が出来る)
buffer 101,w*2,h,0 //gmode7用のバッファ
color:boxf w,0,w+w,h //左半分は白のまま右側を黒で塗りつぶす
gmode 6,0,0,256
pos 0,0
gcopy 100,0,0,w,h //白背景側に黒抜き画像を色減算コピー(白抜き画像が出来る)
gmode 2
//白抜き画像を右側の黒背景に縁マスク用にずらしながら黒透過コピー
rimloop=size*2+1
repeat rimloop
cnty=cnt
repeat rimloop
if ( ((cnt=0) or (cnt=(rimloop-1))) and ((cnty=0) or (cnty=(rimloop-1))) )=0 or mode!0 {
pos w-size+cnt,-size+cnty
gcopy 101,0,0,w,h
}
loop
loop
//白抜き画像だった場所を縁色で塗りつぶす
gradf 0,0,w,h,1,rgb,rgb
pos 0,0
gcopy sel,0,0,w,h //縁色で塗りつぶされた場所に読み込んだ画像を黒透過コピー
gsel sel //最初の操作先に戻す
color :boxf //黒で塗りつぶしてから
gmode 7,w,h
pos 0,0
gcopy 101,0,0,w,h //gmode7でコピー(縁取り画像完成)
return
#global
buffer 1
picload dir_exe+"\\hsptv\\hsptv_img.png",2
color 0,255,0 //縁色指定
edgepic 1,0
sx=ginfo_sx
sy=ginfo_sy
gsel 0
gradf 0,0,640,480,1,$884422,$224488
gmode 2,sx,sy
pos 0,0
gcopy 1