当前位置:  开发笔记 > 编程语言 > 正文

加载一个BitmapSource并在WPF中使用相同的名称保存 - > IOException

如何解决《加载一个BitmapSource并在WPF中使用相同的名称保存->IOException》经验,为你挑选了2个好方法。

当我尝试保存我之前加载的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);
}

看起来加载图像数据后,文件仍然被锁定,打开它的应用程序仍在运行时永远不会被覆盖.任何想法如何解决这个问题?非常感谢任何解决方案.



1> sdippl..:

受到我在这个问题上的评论的启发,我通过将所有字节读入内存流并将其用作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();
}


我是stackoverflow的新手.你可能会看到.因此,在我有15的声誉之前,我就不能对其他人进行投票.由于其他人提供了很好的建议,但对于遇到同样问题的人没有真正的解决方案,我自己提供了答案,这是我自己研究的结果.问题?

2> 小智..:

这是另一种解决方案,基于原始加载代码:

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();

推荐阅读
周扒pi
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有