HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0107
DSSSM縮小表示が切れてしまいます5解決


DSSSM

リンク

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



この記事に返信する


inovia

リンク

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



Hatter

リンク

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 }



Hatter

リンク

2010/1/7(Thu) 20:05:46|NO.29816

私のスクリプトの最初の3行はちょっとおかしかった。以下に訂正。

dialog "*.bmp",16,"画像ファイル" if stat=0 : stop buffer 8:picload refstr



DSSSM

リンク

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



DSSSM

リンク

2010/1/9(Sat) 08:46:07|NO.29843

Hatterさん、どもども


 HPを見させていただいたら、中学生の方だったんですね! びっくりしました……。

 Hatterさんに書いていただいたスクリプト、私ははまだ分からない点が多いんですが、
とりあえずginfoでクライアント領域サイズを調べて、posで描写基点を設定、gzoomで
変倍という感じでしょうか……?(ホントにまだ分かってません(^_^;))

 これから、screenの真ん中に画像を描写する方法を調べようと思っていたので、その
時にも参考にさせていただこうと思います。また質問させていただく事があるかと思い
ますが、またよろしくお願いします。



ONION software Copyright 1997-2023(c) All rights reserved.