GIFアニメーション再生等について
mic 2020/02/15(Sat) 00:18
はじめまして。
OpenSiv3Dにて高速な画像ビューワを作ろうとしているのですが、次のようなところまではたどり着けました。
・フォルダ or zip or 7-zip をウィンドウにD&Dしたら、その中の画像データを順次閲覧できる。
・フォルダをD&Dしたときは、各画像ファイルを TextureAsset::Register() に渡して処理しています
(TextureAssetがすごく便利です)。
・zip or 7-zip のD&Dのときは、アーカイブ内の全データをファイルではなくメモリ上へ解凍し、そこから
Texture tex(ByteArray([メモリ上各ファイルの先頭へのポインタ], [各ファイルのサイズ]),
TextureDesc::Mipped);
のような感じで作ったテクスチャをdrawし、閲覧する画像を切り替える毎にrelease→テクスチャ作成を
繰り返します(もうちょっとなんとかしたい)。
そこで、いくつか質問や要望があります。
@ GIFアニメーション(できればPNGアニメーションも)を表示できるようにしたいのですが、
自力で各フレームを展開→テクスチャへ転送→アニメーション処理をするしかありませんでしょうか。
以前は Imaging::ExpandAnimatedGIF() や Imaging::LoadAnimatedGIF() といった関数があったようなのですが、
見つけることができませんでした。(見落としていたらスミマセン)
…静止画をdrawするのと同じ方法でdrawするだけでアニメーション表示される機能があれば嬉しいのですが…。
A zip等アーカイブ内の各画像ファイルを、ファイルに書き出すことなく、直接ImageやTextureの
コンストラクタに、そしてTextureAsset::Register()にも渡せるようにして頂けませんでしょうか。
B また、上述のようなByteArrayをTextureAsset::Register()に渡せるようになると有り難いです。
C 将来的にサムネイル一覧を高速に表示できるようにするつもりです。
一定容量までディスクにキャッシュとして保存するのが良いように思います。
パッと思いつく限りでは、Imageにデータを渡し、縮小処理→保存といった流れで処理するのかなと考えたのですが、
もっと効率の良い方法はありますでしょうか。
D TextureAssetを複数持つことはできますでしょうか(例えば画像用・サムネイル用等、用途別に分けたい)。
あと、本件とは関係ない要望なのですが、
E SimpleGUIで、コンボボックスが欲しいです。
以上となります。
宜しくお願いいたします。
Reputeless 2020/02/15(Sat) 15:09
1.
・GIF アニメーションの読み込みは実装予定(優先度・中)です
・APNG の読み込みは実装予定(優先度・低)です
・draw() で自動でアニメーションする機能は予定していません
・代わりにアニメーションテクスチャ専用のクラスを実装予定(優先度・低)です
2.
・ZIP ファイルの読み込みは実装予定(優先度・中)です
3.
・上記機能と TextureAssetData::onPreload を組み合わせることで対応できると思います
4.
・その方法で良いと思います
・現在使われている画像フォーマットは、完全に読み込み→縮小以外の方法はありません
・1 つの Image に全部のサムネイルを overwrite で詰め込み、1 つの Texture として管理すると draw call を減らせて描画が効率的です
5.
・TextureAsset に使う名前を工夫する (U"photo", U"photo-th") などして、文字列処理で管理を楽にするのはどうでしょうか
6.
・実装予定(優先度・中)です
特に必要な機能のリクエストについては、個別に GitHub Issues に投げていただけると少しだけ優先度を上げられます。
(GitHub Issues のほうがタスク管理しやすく、機能リクエスト者とコミュニケーションがとりやすいため)
https://github.com/Siv3D/OpenSiv3D/issues
例: https://github.com/Siv3D/OpenSiv3D/issues/466
mic 2020/02/18(Tue) 00:23
ご返事ありがとうございます。
要望のうち、実装予定有りのものが多く、とても楽しみです。
また他の要望等が出てきましたら、GitHub Issues の方に投稿させてもらおうと思います。
>3.
「ByteArrayをTextureAsset::Register()に」ということについてなのですが、
zipのようにアーカイブ内の特定のファイルだけを高速に解答できる形式の場合(この場合はReputelessさんの
仰る方法で将来可能そうです)はともかくとして、7-zipのように高圧縮率と引き換えに特定のファイルだけを
高速に解凍することが苦手な形式の場合に、一旦オンメモリに全解凍し、これをTextureAssetに登録できれば
速度的に有効かなと考えたことが背景にあります(或いはオンメモリにファイル単位で解凍が完了し次第、順次TextureAssetに登録)。
…回答の解釈を間違えていたのであればスミマセン…。
>4.
サムネイルについては、その通りにやってみようかと思います。ご教示ありがとうございます!
>5.
例えば、TextureAsset内の大量のサムネイルだけをリリース・登録解除したい場合に、
名前をもとに個別に処理していくよりも、TextureAssetを複数に分けて、アセット毎にReleaseAllやUnregisterAllでやると
速度的に早いのかな、と思ったのですが、ひとまず名前を工夫する方法でやってみてみようと思います。