WPFコントロールで使用されてきた画像を削除します
-
19-09-2019 - |
質問
私は、コントロールのいくつかの種類に画像をバインドAN後でそれを削除したいと思います。
path = @"c:\somePath\somePic.jpg"
FileInfo fi = new FileInfo(path);
Uri uri = new Uri(fi.FullName, UriKind.Absolute);
var img = new System.Windows.Controls.Image();
img.Source = new BitmapImage(uri);
さて、このコードの後、私はファイルを削除したいと思います:
fi.Delete();
画像は現在使用されているので、しかし、私はそれを行うことはできません。 2エンコードフラグメント1の間に、私はそれを解放するために何ができるのでしょうか?
解決
ImageSourceはに与える前のMemoryStreamに画像をコピー それは次のようになります。
BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.DecodePixelWidth = 30;
bi.StreamSource = byteStream;
bi.EndInit();
ここで、バイトストリームがMemoryStreamをにファイルのコピーである
また、こののが有用であることができる
他のヒント
あなたはMemoryStream
を使用することができますが、ビットマップデータの2つの別々のコピーがRAMに保存されているので、それが実際にメモリを浪費:あなたはMemoryStream
をロードすると、あなたは一つのコピーを作成し、ビットマップがデコードされたときに別のコピーが行われます。このようにMemoryStream
を使用してのもう一つの問題は、あなたがキャッシュをバイパスということです。
これを行うための最善の方法は、BitmapCacheOptions.OnLoadを使用してファイルから直接読み取ることがあります:
path = @"c:\somePath\somePic.jpg"
var source = new BitmapImage();
source.BeginInit();
source.UriSource = new Uri(path, UriKind.RelativeOrAbsolute);
source.CacheOption = BitmapCacheOption.OnLoad;
source.EndInit(); // Required for full initialization to complete at this time
var img = new System.Windows.Controls.Image { Source = source };
このソリューションは、あまりにも効率的で簡単です。
注:画像をディスクに変更することができるので、あなたが実際に例えば、キャッシュをバイパスしたいならば、あなたもCreateOption = BitmapCreateOption.IgnoreImageCache
を設定する必要があります。それはRAM内の画像データの2つのコピーを保持しませんので、しかし、その場合でも、この解決策はMemoryStream
ソリューションよりも優れています。