Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Release handle on file. ImageSource from BitmapImage

Tags:

c#

wpf

xaml

How can I release the handle on this file?

img is of type System.Windows.Controls.Image

private void Load() {     ImageSource imageSrc = new BitmapImage(new Uri(filePath));     img.Source = imageSrc;     //Do Work     imageSrc = null;     img.Source = null;     File.Delete(filePath); // File is being used by another process. } 

Solution


private void Load() {     ImageSource imageSrc = BitmapFromUri(new Uri(filePath));     img.Source = imageSrc;     //Do Work     imageSrc = null;     img.Source = null;     File.Delete(filePath); // File deleted. }    public static ImageSource BitmapFromUri(Uri source) {     var bitmap = new BitmapImage();     bitmap.BeginInit();     bitmap.UriSource = source;     bitmap.CacheOption = BitmapCacheOption.OnLoad;     bitmap.EndInit();     return bitmap; } 
like image 827
NitroxDM Avatar asked Apr 25 '12 16:04

NitroxDM


2 Answers

Found the answer on MSDN Forum.

Bitmap stream is not closed unless caching option is set as BitmapCacheOption.OnLoad. So you need something like this:

public static ImageSource BitmapFromUri(Uri source) {     var bitmap = new BitmapImage();     bitmap.BeginInit();     bitmap.UriSource = source;     bitmap.CacheOption = BitmapCacheOption.OnLoad;     bitmap.EndInit();     return bitmap; } 

And when you get an ImageSource using the method above, source file will be immediately closed.

see MSDN social forum

like image 175
csteinmueller Avatar answered Sep 25 '22 21:09

csteinmueller


I kept running into issues with this on a particularly troubling image. The accepted answer did not work for me.

Instead, I used a stream to populate the bitmap:

using (FileStream fs = new FileStream(path, FileMode.Open)) {     bitmap.BeginInit();     bitmap.StreamSource = fs;     bitmap.CacheOption = BitmapCacheOption.OnLoad;     bitmap.EndInit(); } 

This caused the file handle to be released.

like image 31
Chris Avatar answered Sep 24 '22 21:09

Chris