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


HSPTV!掲示板


未解決 解決 停止 削除要請

2006
0705
うひょ画像ファイルの縦・横サイズを取得したい12解決


うひょ

リンク

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サイズがとてつもなく大きな画像には対応できない気が・・・



I386

リンク

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も探せば結構出てきます。



Kpan

リンク

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



K

リンク

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になる

実際に実行させた訳じゃないからこれで、直るかは分からない



K

リンク

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

こんな感じに変数の表示をしてれば、自分でバグを直せたはず・・・

#変数名が間違ってたので修正して再掲載



K

リンク

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の部分)に初期化して
クライアントエリアサイズで本当のサイズにしてる
(小さい窓をツールウィンドウにすると描画されない部分が出るため)



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