|
|
2006/7/5(Wed) 18:32:25|NO.1264
画像を表示して、そこをクリックして色を選択するため、
新しいウィンドウに画像を表示します。
しかし、小さい画像をpicloadで表示すると、画像の左に変な余白ができています。
(具体的には、その余白部分には起動するときのその部分の下の画面がそのまま映っている)
小さい画像でも隙間なく表示することはできないのでしょうか。
あと、onclickでクリックされたウィンドウIDを取得するにはどうすれば良いでしょうか。
よろしくお願いします。
|
|
2006/7/5(Wed) 19:00:16|NO.1265
小さいウィンドウが透けてしまうのは、その部分が初期化されていないからです。
ウィンドウを小さくするのには制限があるので、
初期化されない部分ができてしまうのです。
とりあえず、画像をgzoomで拡大して表示してみてはどうでしょうか。
いずれにせよ、あまり小さな画像では操作しにくいでしょうし。
ウィンドウIDの取得はonclickのジャンプ先でginfoを使えば調べることができますよ。
|
|
2006/7/5(Wed) 20:26:42|NO.1266
拡大する方法だと、大きい画像を開いたときに変なことになりそうです。
画像の縦・横サイズがわかればそれに合わせて処理することもできるのですが。
あと、今気付いたのですが、このスレッドのタイトルが
「画像ファイルの縦・横サイズを取得したい」なのに、
質問の内容にそのことが入っていませんね(笑)
笑い事じゃないような気もしますが…
|
|
2006/7/5(Wed) 23:16:50|NO.1267
何処に書いてあったかはわすれましたが、
picloadで画像を読み込んだときに、ウィンドウサイズが自動で調節されるのを
利用して画像のサイズを調べる方法があったと思います。
具体的には
1、bufferで初期化したウィンドウにpicloadで画像を読み込む
2、ginfo(12),ginfo(13)でウィンドウ初期化サイズを取得する
3、このサイズを判定して、小さすぎる画像の場合は引き伸ばす
とやればいいと思います。
ただ、この方法だとYサイズがとてつもなく大きな画像には対応できない気が・・・
|
|
2006/7/6(Thu) 12:29:50|NO.1270
その画像フォーマットを調べて、peekなどで取り出したらどうすか?
これだと画像を読み込む前にサイズを調べることもできます。
|
|
2006/7/6(Thu) 14:47:21|NO.1271
ファイルの仕様が分からないんです…
インターネットで探したりしてますが、なかなか見当たりません。
|
|
2006/7/6(Thu) 18:29:25|NO.1273
BMPファイルの仕様なら、imgctl.hpiを公開していらっしゃる
ルーチェさんのHPが参考になると思いますよ。
JPEGやGIFも探せば結構出てきます。
|
|
2006/7/6(Thu) 20:37:43|NO.1274
「bmp フォーマット」とか「gif フォーマット」でググればヒットしますよ。
↓はBMP。
sdim buf
bload "sample/demo/logop.bmp", buf
mes ""+lpeek (buf, $12)+" x "+lpeek (buf, $16)+"
picload "sample/demo/logop.bmp", 1
|
|
2006/7/6(Thu) 21:17:13|NO.1275
ありがとうございます!
読み込むのはbmpのみなので、これでOKです!
これを使ってやってみます。
gifやjpegなどもやってみます。
|
|
2006/7/7(Fri) 18:13:53|NO.1279
すみません。
gzoomでやってみたんですが、うまくいきません。
最初はうまくいったのですが、
xかyが700より大きいときは縮小する処理を追加すると、
縮小はうまくいくのに拡大はうまくいかなくなりました。
このスクリプトなのですが…
dialog "bmp",16,"画像"
gzx = gazoux(refstr) ;画像のxサイズを取得する関数
gzy = gazouy(refstr) ;画像のyサウズを取得する関数
if gzx<300:gxw = double(300/gzx) ;画像のxサイズが300より小さいとき、300/画像の大きさをgxwに代入
if gzy<300:gyw = double(300/gzy) ;上のyバージョン(gxwはgyw)
if gxw>0|gyw>0{ ;gxwかgywが0より大きいとき(xかyが300より小さいとき)
in = max(gxw,gxy) ;大きい方をinに代入
buffer 4
picload refstr ;バッファーに画像を読み込み
screen 2,gzx*in,gzy*in,6,100,100 ;スクリーンを拡大後の大きさに初期化
gzoom gzx*in,gzy*in,4,0,0,gzx,gzy ;コピー
}else{
if gzx>700|gzy>700{ ;画像のxかyが700より大きい場合
if gzx>700:gxw=double(700/gzx) ;xが700より大きければgxwに700/画像の大きさを代入
if gzy>700:gyw=double(700/gzy) ;上のyバージョン(gxwはgyw)
if gxw<=0:gxw=1 ;gxwが0以下なら1を代入
if gyw<=0:gyw=1 ;gywが0以下なら1を代入
in = min(gxw,gyw) ;小さい方をinに代入
buffer 4
picload refstr ;バッファーに画像を読み込み
screen 2,gzx*in,gzy*in,6,100,100 ;スクリーンを縮小後の大きさに初期化
gzoom gzx*in,gzy*in,4,0,0,gzx,gzy ;コピー
}
}else:screen 2,gzx,gzy,6,100,100:picload refstr ;ちょうど良い大きさならそのまま表示
gsel 2,1
| |
|
2006/7/7(Fri) 20:23:54|NO.1280
>縮小はうまくいくのに拡大はうまくいかなくなりました。
どんな風に、うまくいかないのかの説明が出来るぐらいデバックしてください。
どこで、予想するデータと違ってるか変数を表示させて確認とかしてますか?
ちょっと気になる所は
>if gzx<300:gxw = double(300/gzx) ;画像のxサイズが300より小さいとき、300/画像の大きさをgxwに代入
>if gzy<300:gyw = double(300/gzy) ;上のyバージョン(gxwはgyw)
double(300/gzx)これだと小数点以下はかならず0
やるならdouble(300)/gzxとか300.0/gzx
>if gxw>0|gyw>0{
実数形変数と整数の比較はうまくいかない0.0にする
>gzx*in
左側が整数なら右側も整数として扱われる
inが1.5でも1になる
実際に実行させた訳じゃないからこれで、直るかは分からない
|
|
2006/7/8(Sat) 07:30:02|NO.1281
もう一つあった
>}else:screen 2,gzx,gzy,6,100,100:picload refstr ;ちょうど良い大きさならそのまま表示
これは置く場所を間違ってる
#define ctype min(%1,%2) (%1)*((%1)<(%2))+(%2)*((%1)>=(%2))
#define ctype max(%1,%2) (%1)*((%1)>(%2))+(%2)*((%1)<=(%2))
#module
#deffunc bmpsiz str fn,var sx,var sy
dim siz,2
bload fn,siz,8,18:if stat=0{end}
sx=siz
sy=siz(1)
return
#global
screen 0,,,,0,0 ;スクリーンを拡大後の大きさに初期化
gxw=0.0:gyw=0.0
dialog "bmp",16,"画像":if stat=0{end}
bmpsiz refstr,gzx,gzy ;画像のxサイズを取得
mes "画像サイズ x"+gzx+" y"+gzy
if gzx<300:gxw = double(300)/gzx ;画像のxサイズが300より小さいとき、300/画像の大きさをgxwに代入
if gzy<300:gyw = double(300)/gzy ;上のyバージョン(gxwはgyw)
if (gxw>0.0)|(gyw>0.0){ ;gxwかgywが0より大きいとき(xかyが300より小さいとき)
in = max(gxw,gyw) ;大きい方をinに代入
mes "拡大表示 x"+in*gzx+" y"+in*gzy
buffer 4
picload refstr ;バッファーに画像を読み込み
screen 2,in*gzx,in*gzy,6,100,100 ;スクリーンを拡大後の大きさに初期化
gzoom in*gzx,in*gzy,4,0,0,gzx,gzy ;コピー
}else{
if gzx>700|gzy>700{ ;画像のxかyが700より大きい場合
if gzx>700:gxw=double(700)/gzx ;xが700より大きければgxwに700/画像の大きさを代入
if gzy>700:gyw=double(700)/gzy ;上のyバージョン(gxwはgyw)
if gxw<=0.0:gxw=1.0 ;gxwが0以下なら1を代入
if gyw<=0.0:gyw=1.0 ;gywが0以下なら1を代入
in = min(gxw,gyw) ;小さい方をinに代入
mes "縮小表示 x"+in*gzx+" y"+in*gzy
buffer 4
picload refstr ;バッファーに画像を読み込み
screen 2,in*gzx,in*gzy,6,100,100 ;スクリーンを縮小後の大きさに初期化
gzoom in*gzx,in*gzy,4,0,0,gzx,gzy ;コピー
}else{mes "通常表示 x"+gzx+" y"+gzy:screen 2,gzx,gzy,6,100,100:picload refstr} ;ちょうど良い大きさならそのまま表示
}
gsel 2,1
こんな感じに変数の表示をしてれば、自分でバグを直せたはず・・・
#変数名が間違ってたので修正して再掲載
| |
|
2006/7/8(Sat) 08:20:48|NO.1282
おまけ
最小化が必要ないなら
screen 2,in*gzx+2,in*gzy+2,6+8,100,100,in*gzx,in*gzy
これで、横32ぐらいなら大丈夫
ウィンドウを少し大きめ(+2の部分)に初期化して
クライアントエリアサイズで本当のサイズにしてる
(小さい窓をツールウィンドウにすると描画されない部分が出るため)
|
|