Top 上へ 目次
方向性、挫折とダメ出し&浪漫
長期課題的な項目です、残念ながら今回は見送った熟成期間が必要なネタです。
ここで取り上げるのは縮小画像の管理方法です。(ォィ
Ver.11で抜本的に直したかったんですが、3回挫折したので諦めます。
まず、As/Rでは縮小画像の管理はImageListを使ってます。
Windows Vista以降で追加されたAPIによって、拡大・縮小が手軽にできるようになり、それを活用したのがVer.11の方向性です。
しかし、このImageListというモノは地雷というか、わりと致命的な性能問題を抱えています。
というのも画像を追加していくと、徐々に「追加」という動作が遅くなっていきます。
具体的には、画像サイズ×枚数に対して指数的に性能が落ちていくわけで、おそらく内部で1枚の横長画像に加工して情報を管理してるのではないかと想像しています。
1枚絵として事前に用意されていれば、描画用のデバイスコンテキストを再生成する必要が無いので描画性能にはメリットがあります。
ライブラリのアプローチとしてはありだと思いますが、画像がたくさんあってサムネイル画像をいっぱい並べたいです・・・というような用途だと厳しすぎるデメリットです。
ですからAs/Rには画像の最大数は3000枚、実用レベルは500枚前後(サムネイルのサイズ依存)という目安があります。
ImageListを使う以上は避けられないとはいえ、ファイル管理ソフトとしては「お粗末」と言わざるをえません。
というわけで、サムネイル画像の管理に、ImageListを使わない独自形式の管理を行うという課題を考えてます。
具体的には、以下のようなクラス構成なんですが
class ImageInfo{
public:
ImageInfo(wstring filename, HBITMAP hbmp){name = fileName;hb = hbmp;};
void Draw(HDC hdc, POINT &pt, SIZE &size, bool isSelect, int alpha_blend);//描画座標、サイズ、選択の有無、透明度
private:
wstring name;
HBITMAP hb;
};
class ImageInfoList{
public:
bool LoadImageList(wstring filename);//←ファイルからarrImageに読み込む
bool SaveImageList(wstring filename);//←arrImageを1個のファイルに書き出す
vector <ImageInfo> arrImage;
void Add(wstring filename, HBITMAP hbmp);
void Remove(size_t index);
void Replace(size_t index, wstring filename, HBITMAP hbmp);
};
ただ、このクラス構造は作ってから気がついたのですが論外です。
なぜなら上記の場合のビットマップですが、Windowsアプリケーションの制限としてGDIリソース(画像のほかに、フォント、線を引くペン、塗り潰しするブラシ等の合計)の上限が9,999個しかありません。
Windowsアプリケーションである以上は越えられない壁なので、もう一ひねり必要です。
例えば配列にはビットマップではなく、バイナリデータにしておいて、描画時にビットマップ化するような仕組みを考える必要があります。
ここまですると、描画が遅くて・・・といったところで前途多難過ぎてめどが立ってません。
そもそも、1万個も画像を並べて見るのか?そんな負荷に耐えられるのか?という気もします。
いっそのことSQLite3を使ってDB化してやろうかしら・・・とも考えてますが、現状では妄想に過ぎません。
ちなみに現在の「ローカルサムネイルキャッシュの生成」は、ImageListの機能にベッタリ依存した機能を使ってファイルに保存&読み込んでいるので、仮にこの改善ができたら今度こそ作り直しが必要になります。
ですから、まだまだ最終形態じゃないですよ、進化するかもしれないですよ、とお断りしておきます。
まぁ、他の機能に関してもいえることですが、業界の動向を意識してゆっくりと変化するものと考えていただければと思います。
最後にアンケートからチョイスしたもので、浪漫機能 or ダメ出し(難易度が高め)扱いになっていたものです。
「アンドゥ/リドゥの挙動が分からない」(ダメ出し枠)
アンドゥ/リドゥの確認メッセージを表示する設定になっていると(オプション→その他→確認メッセージ)、なるべく動作を表示するようにしてみました。
「合体変形機構」(浪漫機能枠)
ドッキングウィンドウを全て非表示/復元するコマンドです。
一時的にリストだけを表示したい場合に有用かもしれません。
変形はしませんが、キャストオフと・・・なんだろう・・・ぐぐるとプットオンというらしいですが、個人的には「蒸着」とか「焼結」の宇宙刑事の世代です。
要するに「強化外装の全解除と、再装備する」機能です。(ォィ
ただ有用度が・・・うん、まぁ、微妙なので、メインメニューではなく、機能一覧のほうにひっそりと載せておきます。
一応、ドッキングウィンドウを全部フロート(小ウィンドウで浮かせた状態)にして、「行けっ!フ●ンネル!」と音声合成でしゃべりながら(要Window8以上)、折りたたみ(この動作重要)、ぐりんぐりん動かすのも実装したのですが自重して封印しました。
「曖昧コピペ」(浪漫機能枠)
「曖昧ペースト」の方として、「貼り付け」がちょっと賢くなってます。
ちょっと強気に従来の「貼り付け」コマンドと置き換えです。
(私も慣れてなくて誤爆しまくりなので、オプション画面で無効にできます)
貼り付けコマンドを実行した際に、テキストや画像データだったらファイルを作って、そこに貼り付けます。
それ以外なら、従来通りの「貼り付け」動作になりますので、誤操作しない限り影響は無い・・・はずです。
ブラウザからテキストをコピってテキスト化したり、キャプチャソフトを使うほどでもない数のスクリーンショットを保存したり、といった使い方をするときなどに便利でしょう。
画像は固定のファイル名+連番ですが、テキストの場合はファイル名はテキストの先頭10文字を使って、どんどこ流れ作業ができるようにしています。
「曖昧コピー」の一環として「テキストの中身をコピー」を実装したのですが、判断基準が無いので自動的に切り替えられません。
また複数選択した場合は、全部くっつけてコピーすると凄いデータ量になりそうなので、先頭の1個しか処理しないようにしていますが、UI的に悩ましいところです。
外部コマンドを間に挟むのもうっとおしいですし・・・。
とりあえず、わりと効果的な機能だったのでキー割り当て可能な状態にしています。