WPFでBitmapImageクラスを用いた時に、読み込んだ画像ファイルをプロセスで占有しない方法


はじめに

WPF で BitmapImageクラスを用いた時に、ヘルプページなどのよくある実装例をそのまま利用すると、読み込んだ画像ファイルを対象アプリケーションのプロセスが占有してしまい、アプリケーションを終了するまで、その画像ファイルを変更・削除できなくなります。
その回避策の紹介です。

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