|
|
2007/9/15(Sat) 15:28:13|NO.11071
こんにちは、お邪魔いたします。
grotateで、画像をくるくる回したく、以下のようなソースを組んでみました。
screen 0,800,600
#include "hspmath.as"
buffer 1
picload dir_exe+"/sample/demo/jp6girl.bmp"
gsel 0
pos 100,100
roll=0
gmode 0,280,480
*rep
grotate 1,0,0,deg2rad(roll)
roll+
wait 10
goto *rep
すると、ひどくギザギザしてしまいます。
(もともと回転させようとしていた画像では、ピクセルはずれるわガタガタだわで、
さらに酷い状況に。)
現在のログから「回転」で検索すると拝見できる、NO.4335からの一連の記事を参考に
できるかと思ったのですが、どういじったらいいものか…。
アンチエイリエスをかけたりできればいいのですが、これはもう、仕様だと納得する
のが一番なのでしょうか……。
|
|
2007/9/15(Sat) 22:11:55|NO.11076
>NO.4335からの一連の記事を参考にできるかと思ったのですが、どういじったらいいものか…。
いじる必要ってペタっと貼ってF5で実行してみるだけじゃないかな?(自己責任で)
モジュールの使い方が分からないときはプログラミングガイドの「モジュール」を読んでみるといいかも。
簡単に言えば #module 〜 #deffunc ??? 〜 #global の範囲をコピーしてスクリプトの上の方に貼り付ける。
そうすれば #deffunc ??? の ??? の部分が新しい命令として使えるよ。
HSP3.1からはhspcv.dllにcvrotateっていう命令も追加されているみたいだよ。
hspcvのsampleディレクトリにcvrotate命令を使ったサンプルがあるけどtest.aviを再生してみても真っ黒でよく分からないサンプルだったからちょっと書いてみたの。
; cvrotate命令サンプル
#include "hspcv.as"
fname = dir_exe+"/sample/demo/jp6girl.bmp"
cvload fname, 0 ; 元画像の読み込み
cvgetinfo gx, 0, CVOBJ_INFO_SIZEX
cvgetinfo gy, 0, CVOBJ_INFO_SIZEY
cx = (gy-gx)/2: cy = (gy-gy)/2
screen 0, gy, gy
buffer 1, gy, gy: cls 4 ; 真っ黒バッファ
cvbuffer 1, gy, gy ; 回転用cvバッファ
cvarea 0, 0, gx, gy
ang = 0.0
repeat
await 16
redraw 0
ang += 0.5: if ang = 360.0: ang = 0.0
/* 回転コピー */
gsel 1: cvputimg 1
cvcopy 0, cx, cy, 1, CVCOPY_SET
cvrotate ang, 1.0, 0.0, 0.0, CV_INTER_LINEAR|CV_WARP_FILL_OUTLIERS, 1
gsel 0: cvgetimg 1
redraw 1
loop
透過コピーとかはbufferと併用していかないとダメっぽくて位置の指定とかも一筋縄ではいかないみたいだから工夫が必要だよ。
|
|
2007/9/16(Sun) 00:24:23|NO.11078
hspcv は結構癖がある印象ですね。
書いてるうちにもっと簡単なやり方があるのではと心配になってきましたが
一応少しでも参考になる事を祈りつつ。
#include "hspcv.as"
// 読み込み
dialog "",16 :if stat = 0 :end
exist refstr :if strsize = -1 :end
cvload refstr,0 :if stat ! 0 :end
// サイズ取得
cvgetinfo sizex,0,CVOBJ_INFO_SIZEX :sizex=double(sizex)
cvgetinfo sizey,0,CVOBJ_INFO_SIZEY :sizey=double(sizey)
winx=double(GINFO_WINX)
winy=double(GINFO_WINY)
// 画像がウィンドウ内に納まるかな〜処理
if (winy/winx) >= (sizey/sizex) { x=winx :y=sizey/sizex*winx }
else { y=winy :x=sizex/sizey*winy }
cvresize x,y,0 // ウィンドウぴったりに拡大縮小
cvbuffer 1,winx,winy // メイン画像回転用バッファ
cvbuffer 2,winx,winy // マスク画像コピー元バッファ
cvxors 255,255,255,2 // マスクの色
cvbuffer 3,winx,winy // マスク回転用バッファ
cvarea 0,0,x,y
buffer 1,winx,winy // 回転用バッファの転送先
buffer 2,winx*2,winy // ピクセルアルファーブレンドコピー用バッファ
buffer 3,winx,winy // メインウィドウの背景用バッファ
// 適当に背景作成して見る
repeat 10 :cy=cnt
repeat 10 :cx=cnt
color 127-(cx+cy&1)*63,127+(cx+cy&1)*127,255
boxf cx*winx/10,cy*winy/10,cx*winx/10+winx/10,cy*winy/10+winy/10
loop
loop
repeat
redraw 0
// 画像回転
cvbuffer 1,winx,winy
cvcopy 0,(winx-x)/2,(winy-y)/2,1,CVCOPY_SET
cvrotate cnt\360,1.0,0.0,0.0,,1
// マスク回転
cvbuffer 3,winx,winy
cvcopy 2,(winx-x)/2,(winy-y)/2,3,CVCOPY_SET
cvrotate cnt\360,1.0,0.0,0.0,,3
// ピクセルアルファーブレンド用のバッファ準備
gsel 1 :cvgetimg 1
gsel 2 :pos 0,0 :gcopy 1,0,0,winx,winy
gsel 1 :cvgetimg 3
gsel 2 :pos winx,0 :gcopy 1,0,0,winx,winy
// メインウィンドウにコピー
gsel 0
pos 0,0
gmode 0 :gcopy 3,0,0,winx,winy // 背景画像(通常コピー)
gmode 7 :gcopy 2,0,0,winx,winy // メイン画像(ピクセルアルファーブレンド)
redraw 1
await 30
loop
| |
|
2007/9/17(Mon) 16:08:03|NO.11096
kz3さま、osakanaさま、ありがとうございます!
hspcv…念頭にありませんでした…。すごく綺麗な回転ができました!
お二方のおかげで、とても上手くいきました!本当にありがとうございました!
どなたの参考になるかわかりませんので、どういう風にしたのかを述べておきます。
実際に回転に使用したのは縦・横の長さの同じ画像でした。
画像の背景は白で、貼り付ける先の画面も白です。画像は、円形の装飾のあるイラストで。
osakanaさまのソースを実践に移してみたところ、回転中に画像のふちの線がかすかに
見えてしまいました。
なので、マスク用画像を、円形にそって作ってみました。
お二方のソースを元に、以下のようにしてみました。
(china500-2.jpg: http://1rg.org/up/49279.jpg.html)
(china500-2-mask-2.gif: http://1rg.org/up/49280.gif.html)
#include "hspcv.as"
cvbuffer 0,591,591
cvbuffer 1,591,591
cvload "china500-2.jpg", 1
buffer 1,591*2,591
pos 591,0:picload "china500-2-mask-2.gif",1
screen 0,800,600
angle=0.0
repeat
redraw 0
if angle=360.0:angle=0.0
cvsel 0
cvcopy 1,0,0
cvrotate angle,1.0,0.0,0.0,,0
gsel 1:cvgetimg 0,0
gsel 0
pos -250,265
gmode 7,591,591
gcopy 1,0,0,591,591
angle=angle+0.1
redraw 1
wait 1
loop
長々とすみませんでした。
ありがとうございました。
|
|
2007/9/18(Tue) 23:25:46|NO.11115
すごく綺麗な回転ですね!
|
|
2007/9/20(Thu) 23:05:25|NO.11132
おふたりのおかげですvv 本当にありがとうございました!
|
|