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


HSPTV!掲示板


未解決 解決 停止 削除要請

2009
0928
TAKAHASHI音と写真のスライドショー17解決


TAKAHASHI

リンク

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命令が便利ですので、是非利用する事をお勧めします
(デスクトップサイズの取得等が出来ます。

ループは割愛します。



KA

リンク

2009/9/30(Wed) 23:36:30|NO.28065

>>まったくの初心者の私ですが・・・
>>近日中に完成させないといけない・・・

 →せっぱ詰まるのは、”初心者”で無くても有ります。
  ”初心者”だから、せっぱ詰まる事は有りません。

>>はじめの画面だけは何とか巨大に・・・
>>ただし,画像を出すのところ画面いっぱいにならない・・・

 →次の画像が全画面に成らない事だと思いますが、最初が上手く出来たのな
  ら、それと同じ様にすれば良いだけです。(最初から出来ていない気もし
  ますが...)

  通りすがり氏の回答を無視している様な気がしますが???。

  ちなみに screen は、表示する枠の範囲を決めるだけで、画像自体の大き
  さは変わりません。 提示されたスクリプトに、一行々何をやっているの
  か、コメントを付けると分かりやすく成ります。



TAKAHASHI

リンク

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



SYAM

リンク

2009/10/1(Thu) 12:09:54|NO.28081

gzoomの使い方が間違っています。
gzoomの3つめのパラメータ(ウィンドウID)は、コピー元のウィンドウIDを指定しないといけません。
…これは、ヘルプにも単に「ウィンドウID」でなく「コピー元のウィンドウID」と書いてあるべきですね。他のパラメータには「コピー元の…」って付いてるのに。

また、最初の拡大コピーをする前に3秒待っているのも変です。真っ白なまま3秒待たないと画像が出てきませんが、意図した動作ですか?



mm

リンク

2009/10/1(Thu) 12:24:37|NO.28082

mmloadの使い方も少し変で、まずは画像だけを表示させることにして
プログラムを見やすくしたらどうでしょう。音は後から簡単に差し込めます。

で、あなたのプログラムでは、画像はhspファイルと同じフォルダーにあるべきです。
スクリーンサイズを固定してますので、他のPCでは画像が切れる恐れがあります。
うわらばさんの解答にあったginfoをhelpで調べてください。使用PCの画面いっぱい
の解像度が得られます。次に画像を1枚ずつbufferに読み、そのxyサイズを調べ、
gzoomパラメータにPC画面サイズと共に入れてやります。
2回目以降のscreen命令は、boxfか分からなければ単にclsに置き換えて。



mm

リンク

2009/10/1(Thu) 12:44:13|NO.28083

あ、すみません。mmload間違いではないです。
同じファイルをその都度loadしてると読み違えてしまいました。



mm

リンク

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



SYAM

リンク

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を計算してやればいいですね。



TAKAHASHI

リンク

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



mm

リンク

2009/10/1(Thu) 18:13:48|NO.28090

SYAMさんのいわれるように、このままだと縦位置の写真はひしゃげます。
横位置の写真も微妙に太ったり細ったりします。
時間的余裕が無いようですので、とりあえずは写真のほうをモニター画面に比率をあわせ
トリミング加工をしておくといいかと。縦位置写真は余白を付けて横長画像にしておく。
時間があれば、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 }



TAKAHASHI

リンク

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



SYAM

リンク

2009/10/2(Fri) 14:09:38|NO.28105

未解決になってるのをいいことに、さらに修正すべき点を指摘しときます。

・gosub 命令を使うと、このスクリプトを短くまとめることができ、そうすると、部分的な変更が今よりも圧倒的に楽になります。
まず、gosub命令を使えるようになりましょう。

…それができたら、

・gzoom命令を実行する前に、 ウィンドウID 1 の画面の内容を消しておきましょう。
 でないと、画像のサイズが変わったときに前の画像が見えてしまう可能性があります。

・gzoom命令の前に、 pos 命令で画像を画面の真ん中に表示するようにできますね。
pos (画面の幅-拡大後の画像の幅)/2, (画面の高さ-拡大後の画像の高さ)/2

…で真ん中に来るはずです。 画面の高さにあわせたか幅にあわせたかによって、X座標とY座標のどっちかは0になりますから、gzoom命令の直前でpos命令を使うのが簡単でしょう。



SYAM

リンク

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命令の使いどころを考えてみてください。
ピッタリ当てはまる場所が、ありますね。



TAKAHASHI

リンク

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



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