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


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
1031
アイルー【緊急】複合化処理を使用した、スライドショーでの画像表示について6解決


アイルー

リンク

2010/10/31(Sun) 02:15:53|NO.35590

こんばんは。
画像ビューアを作成しているアイルーです。
こちらの掲示板では大変お世話になっております。

「早急」と書いてしまい、申し訳ございません。
凍結していたはずが、急に月曜日に作品を提出することになってしまい…
大きな問題が3つほど残っており、こちらでお力をお借りできないかと思い、投稿させていただきます。
自分でもギリギリまで粘ってみるつもりではいるのですが…

現在、以下のようなソースで、スライドショーを作成しています。
1機能を抜き出しているため、bufferやwindowのIDがおかしいのは、ご了承ください。
また、ソースが長くなってしまいますが、こちらもご了承ください。


【動作するソース】

#include "hspcv.as"
// ボタン画像読込 buffer 7 : picload "sozai\\button_menu.bmp" /* スライドショーを表示 */ *slide onexit gosub *exit // プログラムの終了処理 buffer 14 : picload "sozai\\button_slide.bmp" // [再生]ボタン screen 4, 706, 600 // ウィンドウの初期化 dirlist imgFileDir, "image\\*.bmp", 0 // ディレクトリ一覧を作成 notesel imgFileDir // 変数バッファの指定 title "タイムズ写真館 : スライド再生中" // 再生ボタン repeat 3 objsize 64, 64 pos 483+cnt*75, 530 if (cnt == 0) { objimage 14, 0, 0, 0, 0, 0, 0 button gosub "", *slide_select } else : if (cnt == 1) { objimage 14, 64, 0, 64, 0, 64, 0 button gosub "", *slide_select } else : if (cnt == 2) { objimage 14, 128, 0, 128, 0, 128, 0 button gosub "", *exit } loop repeat gosub *slide_play // スライドを再生 loop /* スライドショーの画像表示 */ *slide_play repeat notemax //行数分繰り返す noteget tmpImg, cnt cvload "image\\" + tmpImg, 0 // 画像読込 // 画像情報取得 cvgetinfo imgSizeX, 0, CVOBJ_INFO_SIZEX cvgetinfo imgSizeY, 0, CVOBJ_INFO_SIZEY // 画面サイズ windowSizeX = 706 windowSizeY = 530 // 画像と画面の比率 ratioX = double(windowSizeX) / imgSizeX ratioY = double(windowSizeY) / imgSizeY // アスペクト比を固定で、画像をバイキュービック法でリサイズ if ratioX > ratioY { cvresize ratioY * imgSizeX, windowSizeY, 0, CV_INTER_CUBIC // リサイズ後の画像サイズを取得 effectImgSizeX = ratioY * imgSizeX effectImgSizeY = windowSizeY } else { cvresize windowSizeX, ratioX * imgSizeY, 0, CV_INTER_CUBIC // リサイズ後の画像サイズを取得 effectImgSizeX = windowSizeX effectImgSizeY = ratioX * imgSizeY } buffer 1, 800, 600 // フェードイン用画面 cvgetimg 0, 0 // 画像を表示 // フェードイン処理 color 255 gsel 4 repeat 257 redraw 0 color : boxf 0, 0, effectImgSizeX, effectImgSizeY gmode 3, , , cnt pos 0, 0 : gcopy 1, 0, 0, 800, 600 wait 1 if flg == 2 : break gosub *slide_flg redraw 1 loop if flg == 2 : break wait 500 // 表示間隔を設定 buffer 1, 800, 600 // フェードアウト用画面 gcopy 4, 0, 0, 800, 600 // フェードアウト処理 gsel 4 repeat 257 redraw 0 color : boxf 0, 0, effectImgSizeX, effectImgSizeY pos 0, 0 gmode 4, , , 256-cnt gcopy 1, 0, 0, 800, 600 wait 1 if flg == 2 : break gosub *slide_flg redraw 1 loop if flg == 2 : break loop goto *exit /* スライドショーの再開・一時停止用フラグ */ *slide_flg if flg == 0 : return repeat wait 20 if flg != 1 : break loop return /* ボタン押下時の処理 */ *slide_select flg = stat if flg > 2 : dialog "エラーがあります stat = " + flg : end return /* プログラムの終了処理 */ *exit // ウィンドウIDが0以外はウィンドウを非表示 /* ソース省略 */

上記のような感じで動作させているのですが、画像読み出しの仕様を変えることになりました。

正確には、画像を暗号化させ、拡張子を変えたものを、複合化してから呼び出す、ということになります。
他機能部分になりますが、実際に複合化している部分のソースを記載いたします。


【複合化サンプルソース(動作済み)】

/* 画像を復号化してから表示する */ *sample screen 0, 800, 600 : cls // ウィンドウの初期化 button "画像を表示", *img_click stop /* 複合化処理 */ *img_click screen 3, 706, 600 // ウィンドウの初期化 dirlist imgFileDir, "image\\*.test", 0 // ディレクトリ一覧を作成(拡張子が「test」になります) notesel imgFileDir // 変数バッファの指定 sdim strListboxText // タイトル表示用変数 noteget tmpImg, strTitleNum // 行数分のテキストデータの取得 tmpImg = strmid (tmpImg, 0, 7) // 先頭から7バイト取得…拡張子を除いたファイル名取得 gosub *decryption // 画像の複合化 buffer 2, , , 0 // 画像読込用バッファ作成 gsel 2 // ウィンドウID2をアクティブに picload "MEM:dammy" // メモリ上の画像データを読み込む // 画像サイズ imgSizeX = ginfo_sx imgSizeY = ginfo_sy // 画面サイズ windowSizeX = 706 windowSizeY = 530 // 画像と画面の比率 ratioX = double(windowSizeX) / imgSizeX ratioY = double(windowSizeY) / imgSizeY gsel 3 // ウィンドウID3をアクティブに // アスペクト比固定で画像をリサイズ if ratioX > ratioY { gzoom ratioY * imgSizeX, windowSizeY, 2, 0, 0, imgSizeX, imgSizeY } else { gzoom windowSizeX, ratioX * imgSizeY, 2, 0, 0, imgSizeX, imgSizeY } stop /* 画像の複合化処理 */ *decryption // 画像ディレクトリを変数に一時格納 tmpImgName ="image\\" + tmpImg + ".test" exist tmpImgName : size = strsize // ファイルのサイズの取得 dim buf, (strsize + 3) / 4 bload tmpImgName, buf, size // ファイル読込 repeat 1024/4 // 最初の1KB分復号化 buf.cnt= (-$a1b2c3d4)^buf.cnt // 「-$a1b2c3d4」は復号化のキー loop memfile buf // メモリ空間を持った変数に復号処理済みデータを挿入…以後「MEM:」で読み出し可能 return


行いたい処理としては、流れ的に、
1.noteget tmpImg // 行数分のテキストデータの取得
2.tmpImg = strmid (tmpImg, 0, 7) // 先頭から7バイト取得…拡張子を除いたファイル名取得 3.gosub *decryption // 複合化ラベルへ遷移 4.*decryption // 複合化処理 5.picload "MEM:dammy // 複合化した画像の読み込み 6.画像をリサイズして、表示する
となります。

実際、3機能のうち、2機能については、上記【複合化サンプルソース】を用いて、複合化を行って表示することに成功しているので、複合化のソースについては、間違っておりません。(書き方はともかくとして…)

実際に行いたいのが、上記の【動作するソース】内で、画像の複合化処理を行いたいのです。
スライドショーを行う際、画像は縦向きのもの、横向きのものが混在しているのですが、写真の下部にキャプションを表示させたいため、ウィンドウのサイズは固定させています。
そのため、HSPCV機能を用いて、画像を表示していたのですが、HSPCVでmemfile命令は使用できないということで…


【動作しないスライドショーのソース】
(そのまま載せているので、長くて申し訳ありません)

/* スライドショーを表示 */
*slide onexit gosub *exit // プログラムの終了処理 buffer 14 : picload "sozai\\button_slide.bmp" // [再生]ボタン screen 4, 706, 600 // ウィンドウの初期化 gosub *caption // キャプションを取得 dirlist imgFileDir, "image\\*.tama", 0 // ディレクトリ一覧を作成 notesel imgFileDir // 変数バッファの指定 title "タイムズ写真館 : スライド再生中" // 再生ボタン repeat 3 objsize 64, 64 pos 483+cnt*75, 530 if (cnt == 0) { objimage 14, 0, 0, 0, 0, 0, 0 button gosub "", *slide_select } else : if (cnt == 1) { objimage 14, 64, 0, 64, 0, 64, 0 button gosub "", *slide_select } else : if (cnt == 2) { objimage 14, 128, 0, 128, 0, 128, 0 button gosub "", *exit } loop repeat gosub *slide_play // スライドを再生 loop /* スライドショーの画像表示 */ *slide_play repeat notemax //行数分繰り返す noteget tmpImg, strTitleNum // 行数分のテキストデータの取得 tmpImg = strmid (tmpImg, 0, 7) // 先頭から7バイト取得…拡張子を除いたファイル名取得 gosub *decryption // 画像の複合化 buffer 2, , , 0 // 画像読込用バッファ作成 gsel 2 // ウィンドウID2をアクティブに picload "MEM:dammy" // メモリ上の画像データを読み込む // 画像サイズ imgSizeX = ginfo_sx imgSizeY = ginfo_sy // 画面サイズ windowSizeX = 706 windowSizeY = 530 // 画像と画面の比率 ratioX = double(windowSizeX) / imgSizeX ratioY = double(windowSizeY) / imgSizeY gsel 4 // ウィンドウID4をアクティブに // アスペクト比を固定で、画像をバイキュービック法でリサイズ if ratioX > ratioY { gzoom ratioY * imgSizeX, windowSizeY, 2, 0, 0, imgSizeX, imgSizeY // リサイズ後の画像サイズを取得 effectImgSizeX = ratioY * imgSizeX effectImgSizeY = windowSizeY } else { gzoom windowSizeX, ratioX * imgSizeY, 2, 0, 0, imgSizeX, imgSizeY // リサイズ後の画像サイズを取得 effectImgSizeX = windowSizeX effectImgSizeY = ratioX * imgSizeY } buffer 1, 800, 600 // フェードイン用画面 // キャプション表示 mesWidth = 460 pos 15, 545 retmes strTitleCaption(cnt), mesWidth // フェードイン処理 color 255 gsel 4 repeat 257 redraw 0 color : boxf 0, 0, effectImgSizeX, effectImgSizeY gmode 4, , , cnt pos 0, 0 : gcopy 1, 0, 0, 800, 600 wait 1 if flg == 2 : break gosub *slide_flg redraw 1 loop if flg == 2 : break wait 500 // 表示間隔を設定 buffer 1, 800, 600 // フェードアウト用画面 gcopy 4, 0, 0, 800, 600 // フェードアウト処理 gsel 4 repeat 257 redraw 0 color : boxf 0, 0, effectImgSizeX, effectImgSizeY pos 0, 0 gmode 4, , , 256-cnt gcopy 1, 0, 0, 800, 600 wait 1 if flg == 2 : break gosub *slide_flg redraw 1 loop if flg == 2 : break loop goto *exit /* スライドショーの再開・一時停止用フラグ */ *slide_flg // 【動作するソース】と同様なので省略 /* ボタン押下時の処理 */ *slide_select flg = stat if flg > 2 : dialog "エラーがあります stat = " + flg : end return /* プログラムの終了処理 */ *exit // ウィンドウIDが0以外はウィンドウを非表示 // ソース省略 *decryption // 【複合化サンプルソース】と同様なので省略


上記ソースだと、画面が真っ白のまま、画像が読み込めない状態です。
途中処理を止めたりして、処理の流れを追ってはいるのですが…

長々とソースを書き連ねてしまい、説明もわかりづらく、本当に申し訳ございません。

どうかご助言の程よろしくお願いいたします。



この記事に返信する


ORZ

リンク

2010/10/31(Sun) 02:38:25|NO.35592

3行でわかるまとめ
作ってるスライドショー(上)に機能(真ん中)を追加した(一番下)ら動かなくなった。長くてごめんね。
単体でテストしたら正しく動くことはどうやら確からしい。説明下手でごめんね。
画面が真っ白で画像が読み込めていないようだ。このソース読んでボスケテ。長くてごめんね。


一番下のソースのどこの部分に改変をくわえたのかぐらい書かないと、解読に無駄な手間がかかる。
一番上のソースの改変だということに気付くのに時間がかかり、*slide_playにこっそり
gosub *decryptionと書かれてるのに気付くのに時間がかかった。
主旨を3行でまとめたあたりで力尽きたので心優しき人が月曜日までに読破してくれることを祈ろう。



あまま

リンク

2010/10/31(Sun) 03:43:28|NO.35594

retmesが不明ですが

画像をID4のウィンドウにリサイズコピーし
ID1のバッファにはキャプション表示するだけ

その後フェードイン処理内で
ID4を白で塗りつぶしID1から(キャプションだけ)コピー

このような流れになっている気がするので
画像は見えるとしても一瞬になりそうです


↓この箇所を

gsel 4 // ウィンドウID4をアクティブに // アスペクト比を固定で、画像をバイキュービック法でリサイズ if ratioX > ratioY { gzoom ratioY * imgSizeX, windowSizeY, 2, 0, 0, imgSizeX, imgSizeY // リサイズ後の画像サイズを取得 effectImgSizeX = ratioY * imgSizeX effectImgSizeY = windowSizeY } else { gzoom windowSizeX, ratioX * imgSizeY, 2, 0, 0, imgSizeX, imgSizeY // リサイズ後の画像サイズを取得 effectImgSizeX = windowSizeX effectImgSizeY = ratioX * imgSizeY } buffer 1, 800, 600 // フェードイン用画面 // キャプション表示 mesWidth = 460 pos 15, 545 retmes strTitleCaption(cnt), mesWidth

↓このように変更してみると表示されるかもしれません

buffer 1, 800, 600 // フェードイン用画面 // アスペクト比を固定で、画像をバイキュービック法でリサイズ if ratioX > ratioY { gzoom ratioY * imgSizeX, windowSizeY, 2, 0, 0, imgSizeX, imgSizeY // リサイズ後の画像サイズを取得 effectImgSizeX = ratioY * imgSizeX effectImgSizeY = windowSizeY } else { gzoom windowSizeX, ratioX * imgSizeY, 2, 0, 0, imgSizeX, imgSizeY // リサイズ後の画像サイズを取得 effectImgSizeX = windowSizeX effectImgSizeY = ratioX * imgSizeY } // キャプション表示 mesWidth = 460 pos 15, 545 retmes strTitleCaption(cnt), mesWidth



アイルー

リンク

2010/10/31(Sun) 23:14:35|NO.35609

ORZ様

すみません、まとめてくださってありがとうございます。
とりあえず現状のソースを載せなければならないのかと思って書いてしまいましたが、
あまりにもわかりづらすぎました。
改変した場所を書くなど、もっとわかりやすく書くべきでした。

流れ的にはORZ様の仰る通りです。

そして、自分の書いたわかりづらい投稿を元に、ORZ様がまとめてくださり、



アイルー

リンク

2010/10/31(Sun) 23:20:33|NO.35610

> あまま様

こんばんは。
長く、わかりづらいソースにもかかわらず、対応してくださり、ありがとうございました。

画像をID4のウィンドウにリサイズコピーし
ID1のバッファにはキャプション表示するだけ その後フェードイン処理内で ID4を白で塗りつぶしID1から(キャプションだけ)コピー このような流れになっている気がするので 画像は見えるとしても一瞬になりそうです
この文章を元に、自分のソースをしっかりと見直してみました。

頭の中ではできると思い込んでいたのですが、実際は最後に白い画面で塗りつぶしていた状態だったのですね。

buffer 1, 800, 600 // フェードイン用画面
// アスペクト比を固定で、画像をバイキュービック法でリサイズ if ratioX > ratioY { gzoom ratioY * imgSizeX, windowSizeY, 2, 0, 0, imgSizeX, imgSizeY // リサイズ後の画像サイズを取得 effectImgSizeX = ratioY * imgSizeX effectImgSizeY = windowSizeY } else { gzoom windowSizeX, ratioX * imgSizeY, 2, 0, 0, imgSizeX, imgSizeY // リサイズ後の画像サイズを取得 effectImgSizeX = windowSizeX effectImgSizeY = ratioX * imgSizeY } // キャプション表示 mesWidth = 460 pos 15, 545 retmes strTitleCaption(cnt), mesWidth
とすることにより、画像を表示することができました。
キャプションのほうも、同様に塗りつぶしてしまっていたようで、
こちらも同じようにして直すことができました。

本日休日出勤となってしまい、返信が遅くなってしまい、
申し訳ございません。

前回に引き続き、的確に教えていただいたおかげで、
1か所問題を解決することができました。

ありがとうございました!

※retmesについては、機能上は不要だったので書かなかったのですが、
キャプション(テキストの表示)を指定文字で折り返す必要があり、
使用しています。
わかりづらくて申し訳ありません…



damage

リンク

2010/11/4(Thu) 18:13:32|NO.35682

書き込みが長くなってしまいますが、ご了承ください。
書き込みが長くなってしまいますが、ご了承ください。
書き込みが長くなってしまいますが、ご了承ください。
書き込みが長くなってしまいますが、ご了承ください。
書き込みが長くなってしまいますが、ご了承ください。
書き込みが長くなってしまいますが、ご了承ください。
書き込みが長くなってしまいますが、ご了承ください。
書き込みが長くなってしまいますが、ご了承ください。
書き込みが長くなってしまいますが、ご了承ください。
書き込みが長くなってしまいますが、ご了承ください。
書き込みが長くなってしまいますが、ご了承ください。
書き込みが長くなってしまいますが、ご了承ください。
書き込みが長くなってしまいますが、ご了承ください。
書き込みが長くなってしまいますが、ご了承ください。
書き込みが長くなってしまいますが、ご了承ください。
書き込みが長くなってしまいますが、ご了承ください。
書き込みが長くなってしまいますが、ご了承ください。
書き込みが長くなってしまいますが、ご了承ください。
書き込みが長くなってしまいますが、ご了承ください。
書き込みが長くなってしまいますが、ご了承ください。
書き込みが長くなってしまいますが、ご了承ください。
書き込みが長くなってしまいますが、ご了承ください。
書き込みが長くなってしまいますが、ご了承ください。
書き込みが長くなってしまいますが、ご了承ください。
書き込みが長くなってしまいますが、ご了承ください。
書き込みが長くなってしまいますが、ご了承ください。
書き込みが長くなってしまいますが、ご了承ください。
書き込みが長くなってしまいますが、ご了承ください。
書き込みが長くなってしまいますが、ご了承ください。
書き込みが長くなってしまいますが、ご了承ください。
書き込みが長くなってしまいますが、ご了承ください。
書き込みが長くなってしまいますが、ご了承ください。
書き込みが長くなってしまいますが、ご了承ください。
書き込みが長くなってしまいますが、ご了承ください。
書き込みが長くなってしまいますが、ご了承ください。
書き込みが長くなってしまいますが、ご了承ください。
書き込みが長くなってしまいますが、ご了承ください。
書き込みが長くなってしまいますが、ご了承ください。
書き込みが長くなってしまいますが、ご了承ください。
書き込みが長くなってしまいますが、ご了承ください。
書き込みが長くなってしまいますが、ご了承ください。
書き込みが長くなってしまいますが、ご了承ください。
書き込みが長くなってしまいますが、ご了承ください。
書き込みが長くなってしまいますが、ご了承ください。
書き込みが長くなってしまいますが、ご了承ください。
書き込みが長くなってしまいますが、ご了承ください。
書き込みが長くなってしまいますが、ご了承ください。

と魔法の言葉をつければ許されますよね。

ふざけんな 何が早急にだ 掲示板に頼るのもいい加減にしろ 自分で対処もできずに何が作品だ



晩御飯

リンク

2010/11/4(Thu) 21:34:43|NO.35683

>damageさん
言ってることには全面的に同意。
だけどふざけていると思ったのなら答えないことが一番の回答だと思うよ。



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