質問

私は、コントロールのいくつかの種類に画像をバインド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ソリューションよりも優れています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top