将图像设置为图像源时覆盖(重新保存)图像时出现问题

美好的一天,

我有一些图像权限的麻烦。

我正在从文件加载图像,resize,然后将其保存到另一个文件夹。 我然后显示这样的:

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

这工作正常,麻烦来了,如果用户然后select另一个图像后,并试图将其保存在原始文件。

保存图像时生成exception"ExternalException: A generic error occurred in GDI+."

经过一番玩耍后,我已经缩小了错误imgAsset.Source = new BitmapImage(uriSource); 作为删除这一行,而不是设置的图像源将允许我覆盖这个文件很多次。

我也试着把源头放在别的东西上,然后重新保存,希望旧的引用能够被处理,事实并非如此。

我怎么能通过这个错误?

谢谢,Kohan

编辑

现在使用这个代码,我没有得到例外,但图像源不更新。 此外,因为我不使用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是保持文件不被locking的最佳解决scheme。

  • 要使其每次重新读取文件,还需要添加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控件中加载一个图像时,让我们来处理你的图像,直到你closures你的应用程序才会释放它。 这个原因…我不知道到底是什么,可能是inheritance一些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不会处理图像,从而locking文件。 看看我写的这个转换器来处理这个问题。