|
|
2009/9/28(Mon) 17:26:58|NO.28026
こんばんは。スライドショーを作成しています。
2点質問があります。まず、もともとの大きさが異なる写真をスライドショーで表示する際
に全画面に調整して表示させたいのですがどうしたら良いでしょうか?
次に,写真や音源の貯蔵庫をデスクトップのtyozoukoというフォルダに置いたのですが,
どのようにフォルダパスを指定すればよいのでしょうか。
この2点について教えていただけますと幸いです。なお,画像は30枚、音楽は6パターンく
らいを考えております。
color 0, 0, 0
boxf
color 255, 255, 255
mes "スペースキーを押してください" // スペースキーを押して次の操作に進む
repeat
stick tmp
if tmp&16 : break
wait 2
loop
dialog "開始"// ダイアログ開始
mmload "001.mp3", 0, 0//
mmplay 0// 写真を2秒間表示する
picload "001.JPG"
wait 200// 待ち
mmload "001.mp3", 0, 0//
mmplay 0// 写真を2秒間表示する
picload "002.JPG"
wait 200// 待ち
mmload "001.mp3", 0, 0//
mmplay 0// 写真を2秒間表示する
picload "003.JPG"
wait 200// 待ち
mmload "002.mp3", 0, 0//
mmplay 0// 写真を2秒間表示する
picload "004.JPG"
wait 200// 待ち
mmload "002.mp3", 0, 0//
mmplay 0// 写真を2秒間表示する
picload "005.JPG"
wait 200// 待ち
mmload "002.mp3", 0, 0//
mmplay 0// 写真を2秒間表示する
picload "006.JPG"
wait 200// 待ち
dialog "終了" // ダイアログ終了
end
|
|
2009/9/28(Mon) 17:40:29|NO.28027
一旦bufferを使い他の画面に読み込んだ後、
ginfo_winx,winyからサイズを計算し、gzoomを使用。
デスクトップのフォルダを取得するには、dirinfoが便利。
また、このような似た処理が続く場合は配列を使うと楽ですよ。
ファイル名を配列に入れてrepeat~loopで回せば簡潔になるかと。
mmloadは同じファイルなら1回だけで十分です。
|
|
2009/9/28(Mon) 22:05:18|NO.28030
それぞれのキーワードを入力してF1を押してみてください。
各命令、関数の使い方が載っているはずです。
buffer,gzoomであれば、
buffer 2 : mes "test"
gsel 0
pos 0,0 : gzoom 320,320,2,0,0,100,100,0
このように使います。
具体的なソースをそのまま求めると、貴方が努力していないかのように見えてしまいます。
せめて今書いているソースを提示して、何がどう上手く行かないのか示すといいですよ。
|
|
2009/9/30(Wed) 23:14:05|NO.28064
画面最大化ですが、bgscr命令を用いると言う手もあります。
画像拡大は上に出ている様にbuffer命令、gzoom命令を用いるだけです。
①buffer命令で仮想画面を作成(使い回しをするので最初に一回だけ。
②gsel命令で作業先を仮想画面(bufferで作成した画面)に変更。
③picload命令で画像読み込み。
④gsel命令で作業先を表示画面(screenで作成した画面)に変更。
⑤gzoom命令でscreen等で作成した窓に拡大コピー。
⑥ ②に戻る。
よく命令リファレンス、前述されているソースを読む様にして下さい。
どんなに急いでいても、命令の使い方が分からないと何も解決しません。
それとginfo命令が便利ですので、是非利用する事をお勧めします
(デスクトップサイズの取得等が出来ます。
ループは割愛します。
|
|
2009/9/30(Wed) 23:36:30|NO.28065
>>まったくの初心者の私ですが・・・
>>近日中に完成させないといけない・・・
→せっぱ詰まるのは、”初心者”で無くても有ります。
”初心者”だから、せっぱ詰まる事は有りません。
>>はじめの画面だけは何とか巨大に・・・
>>ただし,画像を出すのところ画面いっぱいにならない・・・
→次の画像が全画面に成らない事だと思いますが、最初が上手く出来たのな
ら、それと同じ様にすれば良いだけです。(最初から出来ていない気もし
ますが...)
通りすがり氏の回答を無視している様な気がしますが???。
ちなみに screen は、表示する枠の範囲を決めるだけで、画像自体の大き
さは変わりません。 提示されたスクリプトに、一行々何をやっているの
か、コメントを付けると分かりやすく成ります。
|
|
2009/10/1(Thu) 11:49:19|NO.28080
皆様ご丁寧にありがとうございます。大変勉強になっております。
皆様のご意見をもとにして,四苦八苦して作ってみましたが,画像が出てきません。
ご意見いただけますと幸いです。
目的は,画像と音楽を同時に出して,3秒たったら次の画像に移行するという内容です。
よろしくお願いいたします。
#packopt name "TEST
buffer 2
screen 1,1280,1200
gsel 2
mmload "01.mp3", 0, 0
mmplay 0
picload "001.JPG"
wait 300
gsel 1
gzoom 1000,1000,1,0,0,100,100,0
screen 1,1280,1200
gsel 2
mmload "02.mp3", 0, 0
mmplay 0
picload "002.JPG"
wait 300
gsel 1
gzoom 1000,1000,1,0,0,100,100,0
screen 1,1280,1200
gsel 2
mmload "03.mp3", 0, 0
mmplay 0
picload "003.JPG"
wait 300
gsel 1
gzoom 1000,1000,1,0,0,100,100,0
end
|
|
2009/10/1(Thu) 12:09:54|NO.28081
gzoomの使い方が間違っています。
gzoomの3つめのパラメータ(ウィンドウID)は、コピー元のウィンドウIDを指定しないといけません。
…これは、ヘルプにも単に「ウィンドウID」でなく「コピー元のウィンドウID」と書いてあるべきですね。他のパラメータには「コピー元の…」って付いてるのに。
また、最初の拡大コピーをする前に3秒待っているのも変です。真っ白なまま3秒待たないと画像が出てきませんが、意図した動作ですか?
|
|
2009/10/1(Thu) 12:24:37|NO.28082
mmloadの使い方も少し変で、まずは画像だけを表示させることにして
プログラムを見やすくしたらどうでしょう。音は後から簡単に差し込めます。
で、あなたのプログラムでは、画像はhspファイルと同じフォルダーにあるべきです。
スクリーンサイズを固定してますので、他のPCでは画像が切れる恐れがあります。
うわらばさんの解答にあったginfoをhelpで調べてください。使用PCの画面いっぱい
の解像度が得られます。次に画像を1枚ずつbufferに読み、そのxyサイズを調べ、
gzoomパラメータにPC画面サイズと共に入れてやります。
2回目以降のscreen命令は、boxfか分からなければ単にclsに置き換えて。
|
|
2009/10/1(Thu) 12:44:13|NO.28083
あ、すみません。mmload間違いではないです。
同じファイルをその都度loadしてると読み違えてしまいました。
|
|
2009/10/1(Thu) 14:58:50|NO.28086
ginfoの使い方です。
画像の縦横比率は考慮していません。
deskX=ginfo(20) :deskY=ginfo(21)
screen 1,deskX,deskY
//picload後
buffer 2
picload "001.JPG"
photoX=ginfo(12) :photoY=ginfo(13)
gsel 1
gzoom deskX,deskY,2,0,0,photoX,photoY
|
|
2009/10/1(Thu) 15:26:37|NO.28087
画像が切れてしまうのは、読み出した画像の大きさを無視しているからですね。
まず、 picload直後のシステム変数 ginfo_winx 、ginfo_winy を別の変数に代入してとっておきます。
これが、読み込んだ画像の幅と高さです。
gzoomの、コピーする大きさ としてこの値を使えば、画像は途切れなくなりますね。
しかし、単純にこれを全画面に貼り付けると、縦横の比率が画面と違う画像だと、ゆがんでしまいます。
それでもよければ、説明はここまでです。
比率を保ったまま全画面に表示したいのであれば、画像の 幅 か 高さ のどちらかを、画面の大きさに合わせる処理がないといけません。
どちらに合わせたらいいかは、画面と画像の縦横のサイズから判断できます。
これ以降、「画面」と「画像」を読み間違えないように注意してください。ややっこしいですよー。
画面と画像の縦横の比率が同じであるとき、つまり、
(画面の高さ:画面の幅) = (画像の高さ:画像の幅)
…のときに、拡大した画像がぴったり画面に収まることはわかると思います。
ですから、
これよりも画像の高さが大きいなら、拡大する大きさは画面の高さに合わせた大きさにすれば入りきることになりますし、
これよりも画像の幅が大きいなら、拡大する大きさは画面の幅に合わせた大きさにすれば入りきることになります。
上の比の等式は
画面の高さ×元の画像の幅 = 画面の幅×元の画像の高さ
…という数式に置き換えられますから、
(ginfo_dispx * 元の画像の幅 > ginfo_dispy * 元の画像の高さ)
…が成り立つとき、拡大後の画像の高さ…つまり、gzoomの「画面にコピーする時の大きさ」のうち X には、画面の幅(ginfo_dispx)を使えばいいことになります。
この場合の 拡大後の画像の幅…つまり「画面にコピーする時の大きさ」の Y は、(拡大後の画像の高さ * 元の画像の幅 / 元の画像の高さ)…になります。これで、元の画像の縦横比が保たれますね。
成り立たない場合は、 Y に画面の高さ(ginfo_dispy)を使って、Xを計算してやればいいですね。
|
|
2009/10/1(Thu) 16:47:29|NO.28089
>とおりすがりさん,うわらばさん,KAさん,SYAMさん,mmさんありがとうございます。
とりあえず,20枚の写真を3秒音楽とともに出していくというスライドショーが完成し
そうです。皆様のおかげです。少しずつまた勉強して,グレードアップしていけたらと
思います。
修正箇所などございましたら,ご意見いただけますと幸いです。
#packopt name "TEST"
deskX=ginfo(20) :deskY=ginfo(21)
screen 1,deskX,deskY
//picload後
mmload "01.mp3", 0, 0
mmplay 0
buffer 2
picload "001.JPG"
photoX=ginfo(12) :photoY=ginfo(13)
gsel 1
gzoom deskX,deskY,2,0,0,photoX,photoY
wait 300
mmload "02.mp3", 0, 0
mmplay 0
buffer 2
picload "002.JPG"
photoX=ginfo(12) :photoY=ginfo(13)
gsel 1
gzoom deskX,deskY,2,0,0,photoX,photoY
wait 300
end
|
|
2009/10/1(Thu) 18:13:48|NO.28090
SYAMさんのいわれるように、このままだと縦位置の写真はひしゃげます。
横位置の写真も微妙に太ったり細ったりします。
時間的余裕が無いようですので、とりあえずは写真のほうをモニター画面に比率をあわせ
トリミング加工をしておくといいかと。縦位置写真は余白を付けて横長画像にしておく。
時間があれば、SYAMさんの計算式を組み込んでください。
|
|
2009/10/1(Thu) 21:02:44|NO.28093
縦横比を保って特定の画面にフィットさせるサンプルスクリプトです。
やりたいことそのままではないでしょうが、ほとんど答え同然のスクリプトになってると思います。
screen 1,320,240,0
gsel 0
dialog "",16,""
if(stat!=1):end
picload refstr
gx=ginfo_winx
gy=ginfo_winy
gsel 1
if(gx*240 > gy*320){
gzoom 320, (320*gy/gx), 0, 0,0,gx,gy, 1
}else{
gzoom (240*gx/gy), 240, 0, 0,0,gx,gy, 1
}
|
|
2009/10/2(Fri) 13:38:17|NO.28104
>mmさん,SYAMさん ありがとうございます。
ご意見を参考に作ってみました。2枚目までのスクリプトを示してありますが,これを20枚分
作れば,5秒の写真が音と一緒に表示することができるんですね!!
お忙しいところ,ありがとうございます。
#packopt name "TEST"
deskX=ginfo(20) :deskY=ginfo(21)
screen 1,deskX,deskY
mmload "01.mp3", 0, 0//1枚目の写真
mmplay 0
buffer 2
picload "001.JPG"
photoX=ginfo(12) :photoY=ginfo(13)
gsel 1
if(photoX*deskY > photoY*deskX){
gzoom deskX, (deskX*photoY/photoX), 2, 0,0,photoX,photoY
}else{
gzoom (deskY*photoX/photoY), deskY, 2, 0,0,photoX,photoY
}
wait 500
mmload "02.mp3", 0, 0//2枚目の写真
mmplay 0
buffer 2
picload "002.JPG"
photoX=ginfo(12) :photoY=ginfo(13)
gsel 1
if(photoX*deskY > photoY*deskX){
gzoom deskX, (deskX*photoY/photoX), 2, 0,0,photoX,photoY
}else{
gzoom (deskY*photoX/photoY), deskY, 2, 0,0,photoX,photoY
}
wait 500
end
|
|
2009/10/2(Fri) 14:09:38|NO.28105
未解決になってるのをいいことに、さらに修正すべき点を指摘しときます。
・gosub 命令を使うと、このスクリプトを短くまとめることができ、そうすると、部分的な変更が今よりも圧倒的に楽になります。
まず、gosub命令を使えるようになりましょう。
…それができたら、
・gzoom命令を実行する前に、 ウィンドウID 1 の画面の内容を消しておきましょう。
でないと、画像のサイズが変わったときに前の画像が見えてしまう可能性があります。
・gzoom命令の前に、 pos 命令で画像を画面の真ん中に表示するようにできますね。
pos (画面の幅-拡大後の画像の幅)/2, (画面の高さ-拡大後の画像の高さ)/2
…で真ん中に来るはずです。
画面の高さにあわせたか幅にあわせたかによって、X座標とY座標のどっちかは0になりますから、gzoom命令の直前でpos命令を使うのが簡単でしょう。
|
|
2009/10/8(Thu) 16:43:47|NO.28195
gosub 命令は、
「まったく同じ命令(の手順)を何度も実行したいとき」
に使うと、すこぶる便利なものです。
ですから、
処理A
処理B
処理C
処理B
処理D
処理B
…なんていうスクリプトは、
処理A
gosub *処理B
処理C
gosub *処理B
処理D
gosub *処理B
stop
処理B
……のようにすると、処理B は一回書くだけで済みます。
となると、たとえば処理Bの内容を書き換えたいとき、上の例では書き換える手間が1/3に減るわけです。
もちろん、書き換え忘れてバグになる可能性も激減します。
以上を踏まえて、もう一度、自分のスクリプトでのgosub命令の使いどころを考えてみてください。
ピッタリ当てはまる場所が、ありますね。
|
|
2009/10/8(Thu) 22:38:59|NO.28210
>SYAM様,皆様
>ありがとうございます。教育的なアドバイスのお陰で,勉強になりました。
>今回,初めてHSPを使ってみたのですが,とても面白いですね。今後も自分なりに学んでいこうと思います。
>おかげさまで自分の行いたいプレゼンができそうです。
#packopt name "TEST"
deskX=ginfo(20) :deskY=ginfo(21)
screen 1,deskX,deskY
mmload "01.mp3", 0, 0//1枚目
mmplay 0
buffer 2
picload "001.JPG"
gosub*msg
mmload "02.mp3", 0, 0//2枚目
mmplay 0
buffer 2
picload "002.JPG"
gosub*msg
end
*msg
photoX=ginfo(12) :photoY=ginfo(13)
gsel 1
if(photoX*deskY > photoY*deskX){
gzoom deskX, (deskX*photoY/photoX), 2, 0,0,photoX,photoY
}else{
gzoom (deskY*photoX/photoY), deskY, 2, 0,0,photoX,photoY
}
wait 300
return
|
|