画像ビューアを作成しているアイルーです。
こちらの掲示板では大変お世話になっております。
「早急」と書いてしまい、申し訳ございません。
凍結していたはずが、急に月曜日に作品を提出することになってしまい…
大きな問題が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 // 【複合化サンプルソース】と同様なので省略
上記ソースだと、画面が真っ白のまま、画像が読み込めない状態です。
途中処理を止めたりして、処理の流れを追ってはいるのですが…
長々とソースを書き連ねてしまい、説明もわかりづらく、本当に申し訳ございません。
どうかご助言の程よろしくお願いいたします。