DOBON.NET DOBON.NETプログラミング掲示板過去ログ

JPG画像表示の速度改善

環境/言語:[C# VS2005 FW2.0]
分類:[.NET]

お世話になってます。ヨシヲと申します。

JPG画像を画面表示している処理に時間がかかっているため、
高速化を図りたいと思っています。
(JPGはネットワーク上のファイルサーバにあります)

現状は Image.FromFile("test.jpg") で実装しています。
FileStreamを使った解析なしの表示も試してみましたが、
画像情報の取得は若干早くなりましたが、表示せると時間がかかり、
最終的には大差がない結果となりました。

上記の他に出来る対応がありましたら、教えて下さい。
■No29174に返信(ヨシヲさんの記事)
> お世話になってます。ヨシヲと申します。
>
> JPG画像を画面表示している処理に時間がかかっているため、
> 高速化を図りたいと思っています。
> (JPGはネットワーク上のファイルサーバにあります)
>
> 現状は Image.FromFile("test.jpg") で実装しています。
> FileStreamを使った解析なしの表示も試してみましたが、
> 画像情報の取得は若干早くなりましたが、表示せると時間がかかり、
> 最終的には大差がない結果となりました。
>
> 上記の他に出来る対応がありましたら、教えて下さい。
>


サムネイル表示ではだめですか?
ヨシヲさんこんにちは、おのでらです。

提示されているコードは「読み込み」の部分ですよね?
表示部分のコードはどうなっているのでしょうか。

あと、読み込みと表示どちらが遅いのかも計測する必要があるかと思います。
コメントありがとうございます

itiさん
一枚の画像を全画面表示するような仕様となっていますので、
サムネイル表示への変更はできないです。
ちなみに、サムネイル表示だと早くできるすべがあるのですか?

おのでらさん
表示部分については気にしていませんでした。
ログを見る限り、取得の方が時間がかかっているようです。

また、表示処理は以下のように実装されています。
Image pImg = Image.FromFile("test.jpg");
 Graphics g = e.e.Graphics;
 g.DrawImage(pImg, new Rectangle(0, 0, pImg.Width, pImg.Height));
g.Flush();

 (FileStreamを使う場合も、Image以下は同じです)
> ログを見る限り、取得の方が時間がかかっているようです。

これは本当でしょうか?
どの程度時間がかかっているのでしょうか?
別の処理の時間がかかっているということはないのでしょうか?
ちなみに、ファイルのサイズ・画像のサイズはどうなんでしょうか?
また、g.DrawImageを行っているのはどこでしょうか?
これがFormなどのPaintイベントで再描画を行っている場合、Paintが何度も呼び出されると
それだけ処理に時間が費やされてしまうと思いますが。

> また、表示処理は以下のように実装されています。
> Image pImg = Image.FromFile("test.jpg");
>  Graphics g = e.e.Graphics;
>  g.DrawImage(pImg, new Rectangle(0, 0, pImg.Width, pImg.Height));
> g.Flush();

g.DrawImageの方が時間がかかると思うのですが。
■No29182に返信(ヨシヲさんの記事)
> コメントありがとうございます
>
> itiさん
> 一枚の画像を全画面表示するような仕様となっていますので、
> サムネイル表示への変更はできないです。


全画面表示でしたか...。サムネイル表示では見栄えに問題ありですね。


>ちなみに、サムネイル表示だと早くできるすべがあるのですか?

はい。jpg(tiffもかな?)であれば多くの場合サムネイルが埋め込まれていますので時間計測したことはないですが、瞬時に読込めます。「サムネイル 高速 c#」なんかで検索するとそのことについての記事にヒットします。


で画像読込の件ですが、やはり初回読込はそのファイルの大きさ見合った時間がかかります。読込んだ後ならメモリに展開して瞬時に表示したり、非表示にしたりは可能なのですが。

実は私も10000*10000pixel以上で250MBクラスの画像をどうストレスなく読み出すかで悩んだことがあります。

"全画像のフォーマットを熟知し、画像が劣化しない程度に画素のみにn列飛ばしでアクセスする(笑)"

ということを考え付いたのですが、フォーマット全部に対応するように実装するにはあまりに面倒すぎて結局実装しませんでした。

なんか役に立てなくてすいません。
■No29174に返信(ヨシヲさんの記事)
> JPG画像を画面表示している処理に時間がかかっているため、
> 高速化を図りたいと思っています。
> (JPGはネットワーク上のファイルサーバにあります)

フリーソフト「Susie」には、JPEG対応のプラグインが
複数リリースされていますが、これらの中に、その画像を
高速に読み込める物はありますか?

もしあれば、Susie プラグインを.NET から利用することで
もしかしたら高速化できるかもしれません。
>ピンフさん
画像は約1MB(3300×2300p)を別サーバから取得して
クライアントに表示しています。

描画処理(g.DrawImage)はpictureBoxのPaintイベントに記載されています。
画像取得はその前に行なっています。

Paintイベントは複数回呼び出されていましたので、初期表示時の分のみを
計測しました。
結果では、取得に1.5秒 表示に1秒でした。
ログは各処理の前後に入れたので、他の処理時間は入っていないと思います。


>itiさん
情報ありがとうございます。
教えて頂いたキーワードでたくさんヒットしました。
今後に使える知識として覚えておきます。


>魔界の仮面弁士さん
情報ありがとうございます。教えて頂いたソフトを見てみます。
■No29195に返信(ヨシヲさんの記事)
> 画像は約1MB(3300×2300p)を別サーバから取得して
> クライアントに表示しています。

■No29182に返信(ヨシヲさんの記事)
> 一枚の画像を全画面表示するような仕様となっていますので、

運用状態がわからないのですが
表示するクライアントの画面解像度の大きさに縮小した画像を用意しておくのはダメでしょうか
1600×1200でもスピードアップを期待できそうですが
■No29195に返信(ヨシヲさんの記事)
> 画像は約1MB(3300×2300p)を別サーバから取得して...
> 計測しました。
> 結果では、取得に1.5秒 表示に1秒でした。

ちょっと横からすいません。
この画像の小ささで取得1.5秒というのはネットワーク速度が原因のような気がします。この辺りの改善を行ってみたほうがプログラムいじるより効果があるかもしれません。

あるいは約1MBクラスの画像を別サーバからではなく、自機の別ハードディスクからの取得とかに変更すれば相当早くなるように思います。
(ちなみに私の環境で自機ハードディスクからの取得は2ミリ秒、表示260ミリくらいです。[duo3GHz, memory4G, 7200rpm, 32bit])

以上です。失礼しました。
■No29195に返信(ヨシヲさんの記事)
> >ピンフさん
> 画像は約1MB(3300×2300p)を別サーバから取得して
> クライアントに表示しています。

そうですか。
ちなみに、この画像ファイルがクライアントにある場合、読込時間に変わりはありますか?
あと、サーバーからクライアントにこの画像ファイルをSystem.IO.File.Copyでコピーする場合、
やはり時間がかかりますか?
クライアント上の画像ファイルの読込時間が短く、またサーバーからクライアントへの画像ファイルコピー時間が短いのであれば、
クライアントに一時ファイルとして画像ファイルをコピーして、これを処理するという方法もあると思います。
ご意見ありがとうございます。

>こうへいさん
元画像を変更するのはNGなので、縮小の対応はできません。

>itiさん
ネットワークの問題も多いにありますね。
その点の改善も提案したいと思います。

>ピンフさん
>クライアントに一時ファイルとして画像ファイルをコピー
この方法は考えもしなかったです。ありがとうございます。
指摘頂いた点の調査を行ってみます。
調査結果から、画像取得に時間がかかっているといことで、
まずは「ネットワーク速度改善」、「適正画像サイズの見直し」を
行うことになりました。
ご指摘や意見を頂き、ありがとうございました。
今後の対応時の参考にさせて頂きます。

特にプログラムでの解決はしておりませんが、解決とさせて頂きます。
放置した形になり、申し訳ありませんでした。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板