[[20171118124453]] 『複数のImageコントロールへの描画速度向上』(欲張り爺) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『複数のImageコントロールへの描画速度向上』(欲張り爺)

 いつもお世話になっております。

 ユーザーフォームで20枚前後の画像(平均2.7Mb)を同数のImageコントロールで表示しています。
 エクスプローラーでのサムネイル風。画像と共に下にテキストボックスというイメージです。
  設定:Image Control Sizeは、 W=108 X H=81、 最大表示数=数4段X7列  ※ 個数は変動

 この設定で18個の画像でテストした所、表示終えるのに7〜8秒時間が掛かる。
 実際、待たされて過ぎている感じです。10年位前の画像処理ソフトを思い出します。

 原画サイズが比較的大きいから、それが処理速度低下の原因となっているのかも?
 (表示しない様にすると素早く動作する)

 尚、このユーザーフォームの目的は、全くMSエクスプローラーと同じです。
 私流にグループ化する事が目的なのです。

 何か速度向上する方法はないのでしょうか?

< 使用 Excel:Excel2013、使用 OS:Windows10 >


原画サイズを小さくするのが効果が大きいと思います。
ユーザーフォームの表示部分は、ユーザーがチューニングできる部分じゃないと思います。
(γ) 2017/11/18(土) 13:40

 原画はJPGです。又、ダウンサイジングした物を使用しないで表示したいと思います。

 >ユーザーフォームの表示部分
 これはImageコントロールのサイズ捉えて良いのでしょうか?
 このサイズを下げればいいのでしょうか? 現在は4:3の W=108 X H=81 です。
 余り小さいサイズは好まないのですが、どの位までしたら良いのでしょうか?
(欲張り爺) 2017/11/18(土) 13:55

表示するロジックの意味でした。
コードの工夫で瞬時に表示するといったことは、
望めないと思います。
(γ) 2017/11/18(土) 14:35

ツリービューとリストビューを使えばそれっぽ物が出来そうですが、
リストビューでイメージが表示出来たかなぁ。。。。

>この設定で18個の画像でテストした所
Imageコントロールは使ったことないですが、
シート上でそのようなものを作った時は、
20〜30個程度ではそんな気にならなかったような気がします。
ただし、50個より多くなると確かに重いので、
50個以上は表示しないようにした記憶があります。5年以上前なので^^;
ただし、マシンの性能はかなりいいものを使ってました。
CADの大きなデータでもすぐに表示が出来るようなマシンを使ってましたので。
(しょぼいのだとファイルを開くだけで30分とか掛かっていたので^^;)

http://hanatyan.sakura.ne.jp/patio/read.cgi?no=139
http://officetanaka.net/excel/vba/listview/index.htm

ただし、リストビューが自分のパソコンにあるかどうかは、
確実ではありません。標準でエクセルに付いているものではないので。
あと、それを利用したマクロを配布して人に使ってもらうのは、
著作権上問題があるので、よく調べて配布してください。

(まっつわん) 2017/11/18(土) 14:53


 γさん、まっつわんさん 有難うございます。

 Imageコントロールのサイズを変更した所で所要時間は殆ど変わりませんでした。
 今回のファイル選択ではGetOpenFileNameを使用しました。この時のダイアログボックスでの表示が瞬時。
 このダイアログボックスの様な速度を期待したのですが、やはりエクセルでは無理なのでしょうね。

 参考サイトへも行きましたが、私はVB6は知りません。又、持っていません。
 ListViewもこの様な使い方は出来るのでしょうか? 普通の表としてしか使った事がありません。
 尚、ListViewはエクセル標準実装されていました。(Excel 2013)

 私のPCのCPUは『Core i3』なので、速度の面ではマシンにはあまり期待出来ません。
 私の知識と環境ではこれ以上致し方ない事と諦めます。
(欲張り爺) 2017/11/18(土) 20:39

もう諦めたとの事なので見てもらえないかもですが、考え方だけ書いておきます。

まず、大きな画像を多数レイアウトすると、それだけCPUもメモリも喰いますので、遅いです。これが真理。
次に、Imageコントロールの表示サイズを変えても、Excelは貼りつけた際の元画像をそのまま内包しているので、大きな画像を縮小して表示しているだけであり、画像ファイルを読み込む時間は、表示サイズが大きくても小さくても変わりません。表示する時間は少しだけ変わりますが、誤差レベルです。

そこで解決策なのですが、予め画像を表示サイズに縮小しておき、これを保存。 Imageコントロールには縮小画像を読み込む事です。これは一般的に、サムネイル表示と呼ばれる考え方であり、windowsでも裏で同じ事を行って、表示を高速化しています。「ダウンサイジングした物を使用しないで表示したい」との事ですが、縮小したものを別途保存しないで、どうやって実現しろと言うのでしょう? C言語等で自力で高速なJPEGデコーダを作成しても、それはwindowsが持っている機能を大幅に上回るような事は、私でも不可能です。BMP画像ならば、間引いて読み込む、とか考えられますが、JPEGは量子化圧縮であり、全画素を展開せざる得ないのですよ。素直に、縮小画像を用意する方向で考えてみてください。

画像を縮小するのは、外部ツールを利用して手作業で行っても良いですし、Imageコントロールに縮小して表示したものを保存する方法を調べてみるのも良いでしょう。 ぱぱっと書いてあげるレベルのものではないので、まずはご自身で調べてみてください。
(???) 2017/11/20(月) 09:21


 >何か速度向上する方法はないのでしょうか?

 Imageコントロールに表示される前、予めメモリ上で縮小させてから表示すればいいですね。
 つまり元の画像をメモリ上にて加工し、その加工された画像を表示することです。
 なので原画への影響もなく、表示スピードもそれなりに期待可能でしょう。

 具体的にはWindows Imaging ComponentのIWICBitmapScalerを使って画像を縮小&拡大などを行います。
https://msdn.microsoft.com/en-us/library/windows/desktop/ee719664(v=vs.85).aspx

 但し、VBAで上記操作をするにはLibraryが用意されていない事もあり、APIを使う事になるでしょう。
 幸いProxy関数がWindowsCodecs.dllで定義されていますので、それを使えばよいかと。

 下記サイトに一覧が列挙されています。
https://msdn.microsoft.com/en-us/library/windows/desktop/ee872008(v=vs.85).aspx
(Abyss2) 2017/11/20(月) 11:42

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.