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


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0707
アイルースライドショーについて9解決


アイルー

リンク

2010/7/7(Wed) 16:20:17|NO.33572

こんにちは。

NO.33550で同時に質問させていただいております。

スライドショーで2点、教えていただきたいことがございます。


・スライドショー表示時の、縦横比の固定について

現在別の機能においては、
縦横比固定で画像を表示することに成功しているのですが、
スライドショーで順に画像を表示するとき、
画像が見つからないということでエラーが発生してしまいます。
まずソースを記載致します。

エラーを解析しておりますが、自分としては、
2枚目の画像が表示されるときに、23行目の
noteload "image\\" + tmpImg
の部分で、リサイズするための情報が取れていないのではと思うのですが、
mesで情報を見ながらやっても、どうしても2枚目からの情報を取得することができませんでした。


<エラー発生のソース>


#include "hspcv.as" #include "user32.as" /* スライドショーを表示 */ *slide // ウィンドウID3を作成 screen 3, 800, 600 // ディレクトリ一覧を作成 dirlist imgFileDir, "image\\*.bmp", 0 // 変数をメモリノートパッド命令のバッファに設定 notesel imgFileDir // notemax=メモリノートパッドの行数 repeat notemax noteget tmpImg, cnt // メモリノートパッド用の変数を作成 notesel bufBmpData // バイナリデータとして画像を読み込む noteload "image\\" + tmpImg // バイナリデータより画像サイズを取得(それぞれ4バイト取得) imgSizeX = lpeek(bufBmpData, $12) // x(横)サイズ imgSizeY = lpeek(bufBmpData, $16) // y(縦)サイズ // 画面:x(横)サイズ windowSizeX = 800 // 画面:y(縦)サイズ windowSizeY = 600 // 画像と画面のx(横)の比率 ratioX = double(windowSizeX) / imgSizeX // 画像と画面のy(縦)の比率 ratioY = double(windowSizeY) / imgSizeY // cvload命令で画像を読み込む cvload "image\\" + tmpImg, 2 // アスペクト比を固定で、画像をバイキュービック法でリサイズ if ratioX > ratioY { cvresize ratioY * imgSizeX, windowSizeY, 2, CV_INTER_CUBIC } else { cvresize windowSizeX, ratioX * imgSizeY, 2, CV_INTER_CUBIC } cvresize 800, 600, 2, CV_INTER_CUBIC // ウィンドウID3に表示 cvgetimg 2, 3 // 表示間隔を設定 wait 400 cls loop stop // 処理の停止


<縦横比固定なしでスライドショーを表示するソース(動きます)>

#include "hspcv.as" #include "user32.as" /* スライドショーを表示 */ *slide // ウィンドウID3を作成 screen 3, 800, 600 // ディレクトリ一覧を作成 dirlist imgFileDir, "image\\*.bmp", 0 // 変数をメモリノートパッド命令のバッファに設定 notesel imgFileDir // notemax=メモリノートパッドの行数 repeat notemax noteget tmpImg, cnt // cvload命令で画像を読み込む cvload "image\\" + tmpImg, 2 cvresize 800, 600, 2, CV_INTER_CUBIC // ウィンドウID3に表示 cvgetimg 2, 3 // 表示間隔を設定 wait 400 cls loop stop // 処理の停止


・スライドショーの、開始・一時停止・停止のボタン対応について

上記のスライドショーに、開始・一時停止・停止等のボタンを
つけたいと考えております。
実際に動かせていないため、イメージ的なものになるのですが、
もうひとつバッファでウィンドウを作成し、そちらにボタンをつけて、
画像と合成する、というような感じになるのでしょうか?

いろいろと問題があり、まずは上記の動くほうのソースでも、
cvloadで画像を読んでいるからなのかわかりませんが、
リサイズした画像のサイズでウィンドウが作られてしまい、
800×600など、固定したサイズでのウィンドウの作成ができません。

可能であれば、ウィンドウのサイズを固定させ(800×600など)、
その中にスライドショーの画像と、ボタンを一緒に表示させ、
スライドを行うといったものにしたいと思っています。


技術不足なのに高望みをしているようで申し訳ありませんが、
どうぞよろしくお願い致します。



この記事に返信する


inovia

リンク

2010/7/7(Wed) 17:14:23|NO.33573

試していませんが、

noteget tmpImg, cnt
の上に

notesel imgFileDir
を入れておけばOKと思われます。



あまま

リンク

2010/7/7(Wed) 20:32:06|NO.33576

1つ目の質問はinoviaさんと同意見です。


2つ目は、CVは使ったことないので不確かですが、
picloadが読み込んだ画像でウインドウがリサイズされるので
cvも同じだと思います。

なので画像を読み込むときはバッファに読み込み
バッファからウィンドウにコピーするという形に直す方が確実です。

ボタンも画像を使うならば、
ボタン用のバッファを用意し、
画像用バッファからウィンドウにコピーしたあと
ボタン用バッファからウィンドウにコピーするという流れになります。



msclover

リンク

2010/7/7(Wed) 22:17:21|NO.33577

>技術不足なのに高望みをしているようで申し訳ありませんが、
技術不足は取り組み方によっては向上のチャンスがあるということです。

プログラムの構造を見直したほうがいいのではないでしょうか?

// メモリノートパッド用の変数を作成 notesel bufBmpData // バイナリデータとして画像を読み込む noteload "image\\" + tmpImg /* 中略 */ // cvload命令で画像を読み込む cvload "image\\" + tmpImg, 2
exist,bloadを使えばnoteselも1つで済み、他の方が言うようなループ中でのnoteselも不要になるでしょう。
そもそもはcvloadで読み込んだ後にイメージサイズをcv命令で参照すれば、ループ中にnote命令は不要になるでしょう。

HSPはメディア操作に特化したプログラミング言語になっています。
他のプログラミング言語では、
  1.画像ファイルのヘッダ部分を読み込む
  2.画像サイズを参照して実データを格納するメモリを確保
  3.画像ファイルの実データ部分を確保したメモリに読み込む
といった事前準備はHSPには大抵の場合不要で、
  1.画像を読み込む(適切にメモリを確保して読み込む)
で済みます。
HSPでのファイルフォーマットを考慮した画像処理プログラミングは特別な場合に限るでしょう。
結局のところcv命令で画像を変形させるにはcvloadで画像を読み込まなければならないので、
  1.cvloadで読み込む
  2.画像サイズをcv命令で取得
  3.変形率を計算
のほうがスマートだと思います。

ちなみに自分もビューワー作ってます。
オンラインゲームの傍ら、垂れ流してくれるだけでいいので操作ボタン等は不要な仕様になってます。



アイルー

リンク

2010/7/7(Wed) 23:10:49|NO.33581

inovia様、あまま様
noteget tmpImg, cnt

の上に
notesel imgFileDir
と記載しましたら、2枚目の画像を読むことができました。

14行目で変数の指定を行っていたので、気にも留めていなかったのですが、
repeatしているので、その都度変数内に1行分のデータを読み込まなければならなかったのですね。
エラーの起きているソースだと、変数内に既に1枚目の情報が入っている中、
2枚目の画像の情報を読み込もうとしていたため、エラーが起きていたということですよね。

それに加えて、画像のリサイズも行うことができました。
ありがとうございます!
(これをバッファを使用して行わなければならないのですが…)



msclover

リンク

2010/7/8(Thu) 19:52:21|NO.33594

俺を無視するな。
画像ファイルをnoteloadで読み込む必要はないと言ってるんだ。
その後にcvloadで画像ファイルを読み込んでいるだろうが。

このプログラムは1回で済むところを同じファイルを2度読み込んでいる。
消費メモリも2倍だ。



アイルー

リンク

2010/7/8(Thu) 20:16:44|NO.33595

msclover 様


ご返信遅くなりまして申し訳ございませんでした。
決して無視しているわけではございません。
不快な思いをさせてしまって申し訳ありませんでした。

まずはソース自体がエラーで動かなかったため、先に
inovia様とあまま様に返信をしてしまいました。
また、先にサムネイルの処理のほうを行っていたため、
こちらの返信が遅れがちとなってしまいました。


msclover 様にご指摘いただいた通り、

> exist,bloadを使えばnoteselも1つで済み、他の方が言うようなループ中でのnoteselも不要になるでしょう。
> そもそもはcvloadで読み込んだ後にイメージサイズをcv命令で参照すれば、ループ中にnote命令は不要になるでしょう。

こちらの部分をしっかりと調べ、現在cvloadのみで画像処理を行うように修正し、
existで画像の情報を取得できるように修正しております。
(exist命令自体を知りませんでした)
できれば見ていただけるくらいのソースに修正できた時点で、
ソースを掲載してみていただだければと思っているのですが、
そこまで作り上げることができませんでした。

そのことだけでもお伝えしておけばよかったのですが、
私の不注意で忘れてしまっておりました。

BMPの画像情報などを、バイナリデータでしか取れないと思い込んでいたため、
やむなくnote命令を使って取り出していたのですが、
それが不要だということですよね。


また、
> プログラムの構造を見直したほうがいいのではないでしょうか?

とございまして、実際に見直してみたのですが、構造を深く考えずに、
少しずつ作りながらここまできてしまったため、
いろいろなところで不具合も出てきてしまっているのだと思います。
他の言語と同様、きっちりと設計から行わなければならないと、
痛感致しております。


尚、本当は自分でソースを書きなおした上で、
動かしてみて確認するべきだと思うのですが、
現在そこまで作業が追い付かず、失礼を承知でお聞き致しますが、
cvload命令で画像を読み込んだ後、
現在はその読み込んだ画像のサイズでウィンドウを作成しておりますが、
ウィンドウサイズを指定して、その中に表示させるというのは可能なのでしょうか。

(例)CVバッファID2(cvloadで取得):画像サイズ:700×400
   ウィンドウID0:サイズ…800×600

   ウィンドウ0の中にCVバッファID2の画像を表示する。


現在のやり方だと、ウィンドウ0のサイズが、
CVバッファID2のサイズで置き換えられています。

以上、お気を悪くされていらっしゃらなければ、ご返答いただけますと助かります。
よろしくお願い致します。



アイルー

リンク

2010/7/8(Thu) 21:54:01|NO.33597

まずはcv命令で画像を取得できるよう、ソースを書き直してみました。
#include "hspcv.as"
/* スライドショーを表示 */ *slide // ウィンドウID3を作成 screen 3, 800, 600 // ディレクトリ一覧を作成 dirlist imgFileDir, "image\\*.bmp", 0 // 変数をメモリノートパッド命令のバッファに設\ notesel imgFileDir repeat notemax //行数分繰り返す noteget tmpImg, cnt // 画像読込 cvload "image\\" + tmpImg, 2 // 画像情報を取得 cvgetinfo imgSizeX, 2, CVOBJ_INFO_SIZEX cvgetinfo imgSizeY, 2, CVOBJ_INFO_SIZEY // 画面サイズを取得 windowSizeX = 800 windowSizeY = 600 // 画像と画面の比率を取得 ratioX = double(windowSizeX) / imgSizeX ratioY = double(windowSizeY) / imgSizeY // アスペクト比を固定で、画像をバイキュービック法でリサイズ if ratioX > ratioY { cvresize ratioY * imgSizeX, windowSizeY, 2, CV_INTER_CUBIC } else { cvresize windowSizeX, ratioX * imgSizeY, 2, CV_INTER_CUBIC } cvgetimg 2, 3 // ウィンドウID3に表示 wait 400 // 表示間隔を設定 cls // 画面を初期化 loop stop // 処理の停止

ttp://www.onionsoft.net/hsp/ref/docs/hspcv.txt
などを参考にやってみましたが、実際に動かしてみると、
note命令が不要だったのがわかります。

あとはNO.33595で書いたように、表示先のウィンドウのサイズを固定させ、
その中にcvresizeした画像を読み込めればいいのですが…
なかなかうまくいかず、むずかしいです…



msclover

リンク

2010/7/8(Thu) 22:57:55|NO.33598

むずかしくなんかない。
どうしてリサイズ画像を表示するとウィンドウの大きさが変わるのでしょう?
リサイズがうまく思い通りリサイズされているかどうかは別として、
リサイズするとウィンドウの大きさが変わるのか?
それとも表示するとウィンドウの大きさが変わっているのか?

慣れない命令、パラメータの意味と指定してるものは合っているのか?

自分を疑うことができれば、掲示板なんて本当は不必要。
ベテランは他人以上に自分を疑うことができる。そして検証する。

ベテランは人に聞かなくても何でも出来るわけではない。
人に聞く前に自分の中の他人に聞いている。だから本当に人に見せるときミスが少ない。
客観視とはそういうもの。

がんばれープログラムの構造は間違っていない。あとは些細な勘違い・思い込み。



アイルー

リンク

2010/7/23(Fri) 18:18:53|NO.33862

msclover 様


家の仏事の都合で、本当に返信が遅くなってしまって申し訳ありませんでした。

msclover 様からのお言葉を元に、自分の書いているソースを疑いました。
そして、命令を適当に使うのではなく、パラメータも含め、その命令を使いこなせるよう、
調べてみました。
cvgetimg 2, 3 // ウィンドウID3に表示

cvgetimg 2, 0 // ウィンドウID3に表示

p2に0を指定することで、
HSPのウィンドウバッファサイズはそのままで転送することができたのですね。

cvgetimg p1,p2

のp2にウィンドウIDを入れるものだと勝手に思い込んでいたため、 難しいと思ってしまっておりました。 本当に、命令の中身を知れば、簡単なことだったのですね。 今後も同様な思い込みでの間違いもあるかと思うので、 一つ一つ疑いながら、処理を進めていきたいと思います。 スライドショーについては、 画像の表示部分(ウィンドウサイズ固定・フェードイン・フェードアウト等の処理) については一応解決しましたので、一旦解決とさせていただきます。 皆様のご助力のおかげで、いろいろと勉強になりました。ありがとうございました。



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