Проблемы с перезаписью (повторным сохранением) изображения, когда он был установлен как источник изображения

Добрый день,

У меня возникают проблемы с разрешениями на изображение.

Я загружаю изображение из файла, изменяя его размер, а затем сохраняя его в другой папке. Затем я показываю это так:

uriSource = new Uri(Combine(imagesDirectoryTemp, generatedFileName), UriKind.Absolute); imgAsset.Source = new BitmapImage(uriSource); 

Это работает нормально, возникает проблема, если пользователь сразу же выбирает другое изображение и пытается сохранить его поверх исходного файла.

Исключение возникает при сохранении моего изображения "ExternalException: A generic error occurred in GDI+."

После некоторых игр вокруг я сузил ошибку до imgAsset.Source = new BitmapImage(uriSource); поскольку удаление этой строки и не настройка источника изображения позволяют мне многократно перезаписывать этот файл.

Я также попытался установить источник на что-то еще, прежде чем снова сохранить в надежде, что старая ссылка будет удалена, это было не так.

Как я могу пройти мимо этой ошибки?

Спасибо, Кохан

редактировать

Теперь, используя этот код, я не получаю исключение, однако источник изображения не обновляется. Кроме того, поскольку я не использую SourceStream, я не уверен, что мне нужно избавиться, чтобы заставить это работать.

  uriSource = new Uri(Combine(imagesDirectoryTemp, generatedFileName), UriKind.Absolute); imgTemp = new BitmapImage(); imgTemp.BeginInit(); imgTemp.CacheOption = BitmapCacheOption.OnLoad; imgTemp.UriSource = uriSource; imgTemp.EndInit(); imgAsset.Source = imgTemp; 

Ты почти там.

  • Использование BitmapCacheOption.OnLoad было лучшим решением для блокировки вашего файла.

  • Чтобы заставить его перечитывать файл каждый раз, когда вам также нужно добавить BitmapCreateOptions.IgnoreImageCache.

Добавление одной строки к вашему коду должно сделать это:

  imgTemp.CreateOption = BitmapCreateOptions.IgnoreImageCache; 

в результате чего этот код:

  uriSource = new Uri(Combine(imagesDirectoryTemp, generatedFileName), UriKind.Absolute); imgTemp = new BitmapImage(); imgTemp.BeginInit(); imgTemp.CacheOption = BitmapCacheOption.OnLoad; imgTemp.CreateOptions = BitmapCreateOptions.IgnoreImageCache; imgTemp.UriSource = uriSource; imgTemp.EndInit(); imgAsset.Source = imgTemp; 

Когда вы загружаете изображение в любой элемент управления WPF, он позволяет обрабатывать ваше изображение и не выпускает его до закрытия приложения. Причина этого … Я точно не знаю, вероятно, ретранслирует на какой-то код DirectX за сценой, который никогда не знает, когда приложение WPF выпускает изображение. Используйте этот код для загрузки изображения.

  MemoryStream mstream = new MemoryStream(); System.Drawing.Bitmap bitmap = new Bitmap(imgName); bitmap.Save(mstream, System.Drawing.Imaging.ImageFormat.Jpeg); bitmap.Dispose(); // Releases the file. mstream.Position = 0; image.BeginInit(); image.StreamSource = mstream; image.EndInit(); this.img.Source = image ; 

это сработало для меня ..

Звучит очень похоже на проблему, с которой я развиваю Intuipic , где WPF не будет удалять изображение, тем самым блокируя файл. Проверьте этот конвертер, который я написал, чтобы решить эту проблему.

Interesting Posts

Получение «Это приложение изменяет ошибку автозапуска из фонового streamа»?

Угловое: выбранное по опции выбора не работает, как исключено, используя вместе с ngModel

Как создать последовательный индекс на основе переменной группировки в фрейме данных

Определить неделю в финансовом году в Excel

ERROR 1066: невозможно открыть iterator для псевдонима в Pig, Generic solution

Ошибка видеокарты NVidia 43?

Папки, названные в качестве текущего месяца по командной строке

Как использовать переменные в одиночных кавычках?

Зачем нам нужно несколько уровней кеш-памяти?

‘Содержит ()’ обходной путь с использованием Linq для Entities?

Su Командная строка

Указывает ли объявление, использующее «авто», выражение extern, использующее спецификатор конкретного типа?

Сколько времени ожидает отсроченный сервис?

Распечатайте существующий PDF (или другие файлы) в C #

Tar Невозможно открыть: нет такого файла или каталога

Давайте будем гением компьютера.