当我尝试保存我之前加载的BitmapSource时,System.IO.IOException
会抛出一个说明另一个进程正在访问该文件并且无法打开文件流.
如果我之前只保存不加载,一切正常.
加载代码:
BitmapImage image = new BitmapImage(); image.BeginInit(); image.UriSource = uri; if (decodePixelWidth > 0) image.DecodePixelWidth = decodePixelWidth; image.EndInit();
保存代码:
using (FileStream fileStream = new FileStream(Directory + "\\" + FileName + ".jpg", FileMode.Create)) { JpegBitmapEncoder encoder = new JpegBitmapEncoder(); encoder.Frames.Add(BitmapFrame.Create((BitmapImage)image)); encoder.QualityLevel = 100; encoder.Save(fileStream); }
看起来加载图像数据后,文件仍然被锁定,打开它的应用程序仍在运行时永远不会被覆盖.任何想法如何解决这个问题?非常感谢任何解决方案.
受到我在这个问题上的评论的启发,我通过将所有字节读入内存流并将其用作BitmapImage的Sreamsource来解决问题.
这个完美的工作:
if (File.Exists(filePath)) { MemoryStream memoryStream = new MemoryStream(); byte[] fileBytes = File.ReadAllBytes(filePath); memoryStream.Write(fileBytes, 0, fileBytes.Length); memoryStream.Position = 0; image.BeginInit(); image.StreamSource = memoryStream; if (decodePixelWidth > 0) image.DecodePixelWidth = decodePixelWidth; image.EndInit(); }
这是另一种解决方案,基于原始加载代码:
var image = new BitmapImage(); image.BeginInit(); // overwrite cache if already exists, to refresh image image.CreateOptions = BitmapCreateOptions.IgnoreImageCache; // load into memory and unlock file image.CacheOption = BitmapCacheOption.OnLoad; image.UriSource = uri; if (decodePixelWidth > 0) image.DecodePixelWidth = decodePixelWidth; image.EndInit();