はじめに
WPF で BitmapImageクラスを用いた時に、ヘルプページなどのよくある実装例をそのまま利用すると、読み込んだ画像ファイルを対象アプリケーションのプロセスが占有してしまい、アプリケーションを終了するまで、その画像ファイルを変更・削除できなくなります。
その回避策の紹介です。
回避策
BitmapImage クラスには、BitmapImage.CacheOption プロパティというものがあり、これを変更することで、メモリ上に画像ファイルを保持する期間が変更できます。
BitmapImage.CacheOption プロパティ
上記プロパティを OnLoad に設定することで、読み込み後に画像ファイルを占有しなくなります。
具体的には、以下のコードになります。
BitmapImage bmpImage = new BitmapImage();
using (FileStream stream = File.OpenRead(filePath))
{
bmpImage.BeginInit();
bmpImage.CacheOption = BitmapCacheOption.OnLoad; // ここが重要
bmpImage.StreamSource = stream;
bmpImage.EndInit();
stream.Close();
}
以下にも同様のことが書かれていました。
How to free the memory after the BitmapImage is no longer needed?
ファイルから解放可能なBitmapImageを読み込む
まとめ
私はWPFを用いて こちらのツール を作っています。
Twitterでも開発に役立つ情報を発信しています → @kojimadev