图像文件副本正被另一个进程使用

我正在尝试创建一个用户perfil编辑窗口,在这个窗口中有一个Image控件
当我选择一个图像文件时,它将显示在此Image控件中并将此文件复制到我的图像文件夹中,第一次就可以了,但第二次显示错误

“该进程无法访问文件’C:\ 1.jpg’,因为它正被另一个进程使用。”

我认为这是因为我的Image控件正在使用这个文件,所以,我不知道我能做什么

private void Select_Click(object sender, RoutedEventArgs e) { OpenFileDialog od = new OpenFileDialog(); if (od.ShowDialog() == true) { string imageLocal = @"C:/1.jpg"; File.Copy(od.FileName, imageLocal, true); image1.Source = new BitmapImage(new Uri(imageLocal)); } } 

如果你想加载和显示一个图像,并保持文件适合文件系统中的操作(如重新加载或移动到另一个目录),Uri构造函数将无法工作,因为(正如你所指出的),BitmapImage类挂起文件句柄。

相反,使用这样的方法……

  private static BitmapImage ByStream(FileInfo info) { //http://sofzh.miximages.com/c%23/ Create new Bitmap (System.Drawing.Bitmap) from the existing image file (albumArtSource set to its path name) bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Png); // Save the loaded Bitmap into the MemoryStream - Png format was the only one I tried that didn't cause an error (tried Jpg, Bmp, MemoryBmp) bitmap.Dispose(); // Dispose bitmap so it releases the source image file result.BeginInit(); // Begin the BitmapImage's initialisation result.StreamSource = stream; // Set the BitmapImage's StreamSource to the MemoryStream containing the image result.EndInit(); // End the BitmapImage's initialisation return result; // Finally, set the WPF Image component's source to the BitmapImage } return null; } catch { return null; } } 

此方法接受FileInfo并返回一个BitmapImage,您可以显示它并同时将其移动到另一个目录或再次显示它。

从下面的另一个答案中复制的一个更简单的方法是:

 public static BitmapImage LoadBitmapImage(string fileName) { using (var stream = new FileStream(fileName, FileMode.Open)) { var bitmapImage = new BitmapImage(); bitmapImage.BeginInit(); bitmapImage.CacheOption = BitmapCacheOption.OnLoad; bitmapImage.StreamSource = stream; bitmapImage.EndInit(); bitmapImage.Freeze(); return bitmapImage; } } 

下面显示的方法从文件加载BitmapImage并在加载后立即关闭文件。 请注意,在EndInit之后EndInit关闭源流时,必须设置BitmapCacheOption.OnLoad标志。

 public static BitmapImage LoadBitmapImage(string fileName) { using (var stream = new FileStream(fileName, FileMode.Open)) { var bitmapImage = new BitmapImage(); bitmapImage.BeginInit(); bitmapImage.CacheOption = BitmapCacheOption.OnLoad; bitmapImage.StreamSource = stream; bitmapImage.EndInit(); bitmapImage.Freeze(); // just in case you want to load the image in another thread return bitmapImage; } } 

此代码适用于WPF支持的任何图像格式。 将图像文件内容作为流传StreamSource属性时,WPF将自动创建适当的解码器。

很简单的解决方案

 System.GC.Collect(); System.GC.WaitForPendingFinalizers(); File.Copy(od.FileName, imageLocal, true);