Frage

Ich möchte ein Bild zu irgendeiner Art von Kontrolle binden, ein löschen später.

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

Jetzt, nach diesem Code möchte ich die Datei löschen:

fi.Delete();

Aber ich kann das nicht tun, da das Bild jetzt verwendet wird. Zwischen Codefragment 1 en 2, was kann ich tun, um sie zu lösen?

War es hilfreich?

Lösung

kopieren Sie das Bild auf Memory vor dem Image geben es sollte so aussehen

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

Dabei gilt ByteStream ist Kopie der Datei in Memory

diese kann nützlich sein,

Andere Tipps

Sie könnten einen MemoryStream verwenden, sondern dass tatsächlich verschwendet Speicher, da zwei getrennte Kopien der Bitmap-Daten im RAM gehalten werden: Wenn Sie die MemoryStream laden Sie eine Kopie zu machen, und wenn das Bitmap eine andere Kopie decodiert wird. Ein weiteres Problem bei der Verwendung MemoryStream auf diese Weise ist, dass Sie den Cache umgehen.

Der beste Weg, dies zu tun, ist direkt aus der Datei mit BitmapCacheOptions.OnLoad zu lesen:

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 };

Diese Lösung ist effizient und einfach zu.

Hinweis: Wenn Sie tatsächlich den Cache umgehen, zum Beispiel wollen, weil das Bild Platte sein Ändern auf, sollten Sie auch festlegen CreateOption = BitmapCreateOption.IgnoreImageCache. Aber auch in diesem Fall diese Lösung der MemoryStream Lösung übertrifft, weil es nicht immer zwei Kopien der Bilddaten im RAM.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top