|
|
2010/1/7(Thu) 18:06:57|NO.29812
はじめまして。HSPを始めたばかりの初心者です。質問させて下さい。
画像を縮小表示させるプログラムを作ろうとしていたのですが、画像が、元の大きさの
ものと、縮小されたものが同時に表示されてしまいます。しかしそれだけであれば、screen
ぴったりに縮小させられれば構わないかな……と思ったのですが、screenの大きさ近くにな
ると縮小表示の画像の下部分と右部分が必ず切れてしまう(その結果、元の大きさの画像が
右と下に見えたままになる)という状態になってしまい、解決方法が全然分からないです。
cvgetinfoで画像の大きさを検出して、celputの倍率設定でscreenと同じ大きさに表示……
という風にしたいのですが。どういう問題がありますでしょうか。お教えいただければ幸い
です。
以下、基本部分のスクリプトです。
#include "hspcv.as"
*failed
screen 0,1024,768 ; 画面サイズ指定
cls
objsize 320,24
button "画像ファイルロード",*fload
stop
*fload
cls
dialog "bmp;*.jpeg;*.jpg;*.png",16,"画像ファイル"
if stat=0 : goto *failed
cvload refstr,1 ;指定した画像ファイルをCVバッファID1に読み込み
cvgetimg 1 ;CVバッファID1をウィンドウに転送
celput 0,,0.93,0.93 ;ウィンドウID0に画像を描画
stop
|
|
2010/1/7(Thu) 18:49:21|NO.29813
hspcvを使っているなら、拡大縮小はcelputよりcvresizeの方がよいと思います。
#include "hspcv.as"
*failed
screen 0,1024,768 ; 画面サイズ指定
cls
objsize 320,24
button "画像ファイルロード",*fload
stop
*fload
cls
dialog "bmp;*.jpeg;*.jpg;*.png",16,"画像ファイル"
if stat=0 : goto *failed
cvload refstr,1 ;指定した画像ファイルをCVバッファID1に読み込み
;cvgetinfo x,CVOBJ_INFO_SIZEX,1
;cvgetinfo y,CVOBJ_INFO_SIZEY,1
cvresize 1024,768,1,CV_INTER_AREA
cvgetimg 1 ;CVバッファID1をウィンドウに転送
stop
|
|
2010/1/7(Thu) 20:02:09|NO.29814
質問の意図を取り違えてるかもしれないけどこういう事?
dialog "*.bmp",16,"画像ファイル"
if stat=0 : stop
buffer 8:picload filename
x=ginfo(12):y=ginfo(13)
gsel 0,1
if ginfo(13)>y & ginfo(12)>x{
pos (ginfo(12)-x)/2,(ginfo(13)-y)/2:gzoom x,y,8,0,0,x,y
}else:if double(ginfo(13))/double(ginfo(12)) < double(y)/double(x){
pos ginfo(12)/2-x*ginfo(13)/y/2:gzoom x*ginfo(13)/y,ginfo(13),8,0,0,x,y
}else{
pos ,ginfo(13)/2-y*ginfo(12)/x/2:gzoom ginfo(12),y*ginfo(12)/x,8,0,0,x,y
}
|
|
2010/1/7(Thu) 20:05:46|NO.29816
私のスクリプトの最初の3行はちょっとおかしかった。以下に訂正。
dialog "*.bmp",16,"画像ファイル"
if stat=0 : stop
buffer 8:picload refstr
|
|
2010/1/7(Thu) 21:13:23|NO.29818
inoviaさん、どもども
なるほど! ありがとうございます!
cvresizeの名前は、使えそうな命令を検索してメモってきていたメモ書きに名前が残って
いたので見てはいたものの、それを試すのを全然失念してしまっていたみたいです。
しかもcvgetimgだけで描画されるのですね。私はcvgetimgした上でcelputで初めて描画さ
れるのだと思い込んでました……。
とりあえずそこらへんを織り込んで作り直してみたところ、出来ました! ありがとうご
ざいます! 大変感謝です……。
Hatterさんもありがとうございます。今ぱっと見では良く分からないので、研究させて
いただきますね。
↓が私の作りたかったものでした。構造甘いかもですが……。
#include "hspcv.as"
#include "hspmath.as"
*failed
screen 0,1920,1120 ; 画面サイズ指定
cls
objsize 320,24
button "画像ファイルロード",*fload
stop
*fload
cls
dialog "bmp;*.jpeg;*.jpg;*.png",16,"画像ファイル"
if stat=0 : goto *failed
cvload refstr,1 ;指定した画像ファイルをCVバッファID1に読み込み
cvgetinfo sx, 1, CVOBJ_INFO_SIZEX ;CVバッファID1からxサイズをsxに代入
cvgetinfo sy, 1, CVOBJ_INFO_SIZEY ;CVバッファID1からyサイズをsyに代入
button "go",*gocheck
stop
*gocheck
cls 4
sx = 1.0*sx
sy = 1.0*sy
if sx > 1920 : goto *ycheck
if sy > 1120 : goto *xrecalculate
cvgetimg 1
stop
*ycheck
if sy > 1120 : goto *recheck
goto *yrecalculate ;yを再計算に飛ぶ
*recheck
ychange = sy/1120
xcheck = sx/ychange
if xcheck > 1920 : goto *yrecalculate ;yを再計算に飛ぶ
goto *xrecalculate ;xを再計算に飛ぶ
*xrecalculate
ratio = 1120.0/sy ;xをyと同じ比率にするための比率ratioを出す
rex = ratio*sx ;ratio*sxが新しい縦の長さrex
cvresize rex,1150,1,CV_INTER_AREA
cvgetimg 1 ;CVバッファID1をウィンドウに転送
stop
*yrecalculate ;yを再計算
ratio = 1920.0/sx ;yをxと同じ比率にするための比率ratioを出す
rey = ratio*sy ;ratio*syが新しい縦の長さrey
cvresize 1920,rey,1,CV_INTER_AREA
cvgetimg 1 ;CVバッファID1をウィンドウに転送
stop
| |
|
2010/1/9(Sat) 08:46:07|NO.29843
Hatterさん、どもども
HPを見させていただいたら、中学生の方だったんですね! びっくりしました……。
Hatterさんに書いていただいたスクリプト、私ははまだ分からない点が多いんですが、
とりあえずginfoでクライアント領域サイズを調べて、posで描写基点を設定、gzoomで
変倍という感じでしょうか……?(ホントにまだ分かってません(^_^;))
これから、screenの真ん中に画像を描写する方法を調べようと思っていたので、その
時にも参考にさせていただこうと思います。また質問させていただく事があるかと思い
ますが、またよろしくお願いします。
|
|