Копия файла изображения, используется другим процессом

Я пытаюсь создать окно редактирования прав пользователя, в этом окне есть элемент управления Image
Когда я выбрал файл изображения, он отобразится в этом элементе управления Image и скопирует этот файл в папке с изображениями, первый раз все в порядке, но во второй раз он показывает ошибку

«Процесс не может получить доступ к файлу« C: \ 1.jpg », потому что он используется другим процессом».

Я думаю, это потому, что мой Image Control использует этот файл, поэтому я не знаю, что я могу сделать

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 не будет работать, потому что (как вы указываете) class BitmapImage зависает с дескриптором файла.

Вместо этого используйте такой метод …

  private static BitmapImage ByStream(FileInfo info) { //http://sofru.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 из файла и сразу же закрывает файл после загрузки. Обратите внимание, что необходимо установить флаг BitmapCacheOption.OnLoad когда исходный stream закрывается сразу после EndInit .

 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. При передаче содержимого файла изображения как streamа в свойство StreamSource WPF автоматически создаст соответствующий декодер.

Очень простое решение:

 System.GC.Collect(); System.GC.WaitForPendingFinalizers(); File.Copy(od.FileName, imageLocal, true); 
  • Загрузка файлов через AJAX в JQuery
  • Изменить текст по умолчанию в типе ввода = «файл»?
  • Как заменить сообщение об ошибке ModelState по умолчанию в Asp.net MVC 2?
  • Как перенести файл из одного места в другое на Java?
  • Как преобразовать InputStream в виртуальный файл
  • загрузка нескольких файлов с использованием того же имени ввода в django
  • Как сканировать папку на Java?
  • Как сохранить NSImage в качестве нового файла
  • Стандартный сжатый способ копирования файла на Java?
  • Макрос __FILE__ показывает полный путь
  • ReadAllLines для объекта Stream?
  • Давайте будем гением компьютера.