|
分類:[.NET 全般]
開発環境:VS2022の.NetFramework4.8 言語:C#(WPF)
ZIPファイルにあるエントリーから直接BitmapImageの読み取りを行うメソッドを作りました。 このメソッドは画像1枚あたり1〜2MB程度なら、体感気にならない速度で実行できます。 ただ8MB以上の画像を読み込んだ場合に、BeginInitメソッドからEndinitメソッドで0.5〜1秒ほどの時間がかかります。
実行PCのCPUなどのスペックを上げれば問題を解消できそうですが、それ以外の方法で実行速度を早くする手段はありますか? 8MBなど以上の画像ファイルを高速で読み込む方法があったらアドバイス頂ければ幸いです。 最終的にBitmapImageに変換できれば、unsafeやWin32APIを使った手法でも構いません。
>サンプル /// <summary>ZIPファイルのストリームからビットマップイメージを取得する。</summary> /// <param name="zipPath">ZIPパス</param> /// <param name="fileName">ファイルパス</param> /// <returns>ビットマップイメージ</returns> /// <exception cref="Exception">ZIPファイルの破損などによりストリームからBitmapイメージの変換に失敗した場合</exception> public static BitmapImage ReadStreamBitmapImage(string zipPath, string fileName) { // ストリームから取得したビットマップイメージ BitmapImage bi = new BitmapImage();
using (ZipArchive archive = ZipFile.Open(zipPath, ZipArchiveMode.Read)) { // 処理対象のエントリー ZipArchiveEntry entry = archive.GetEntry(fileName);
try { using (BufferedStream bs = new BufferedStream(entry.Open())) using (MemoryStream ms = new MemoryStream()) { int data = -1; while ((data = bs.ReadByte()) != -1) { ms.WriteByte((byte)data); }
ms.Seek(0, SeekOrigin.Begin);
bi.BeginInit(); bi.CacheOption = BitmapCacheOption.OnLoad; bi.StreamSource = ms; bi.EndInit(); }
if (bi.CanFreeze) { bi.Freeze(); } } catch (InvalidDataException ex) { // 例外処理 } }
return bi; }
|