6

イメージをある種のコントロールにバインドし、後で削除したいと思います。

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();

しかし、画像は現在使用されているため、それはできません。コードフラグメント 1 と 2 の間で、それを解放するにはどうすればよいですか?

4

2 に答える 2

14

を使用することもできますMemoryStreamが、ビットマップ データの 2 つの別々のコピーが RAM に保持されるため、実際にはメモリを浪費しますMemoryStream。この方法で使用する場合のもう 1 つの問題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.IgnoreImageCacheMemoryStreamただし、その場合でも、このソリューションは RAM にイメージ データの 2 つのコピーを保持しないため、ソリューションよりも優れています。

于 2010-03-11T10:27:23.507 に答える
3

imagesource に渡す前に、画像を MemoryStream にコピーします。次のようになります。

BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.DecodePixelWidth = 30;
bi.StreamSource = byteStream;
bi.EndInit();

ここで、byteStream は MemoryStream 内のファイルのコピーです

これも役に立ちます

于 2010-03-11T08:57:04.560 に答える