WPF中的BitmapImage是否会锁定文件

20

我使用:

Dim bmi As New BitmapImage(New Uri(fiInfo.FullName, UriKind.Absolute))
bmi.CacheOption = BitmapCacheOption.OnLoad

这不使用 OnLoad 但文件仍被硬盘锁定以覆盖。 有什么办法可以解锁?

谢谢


还有一些内存问题需要注意。请参见https://dev59.com/0m025IYBdhLWcg3wAg7p#6271982。 - Oppositional
谢谢。你想让我说,如果链接不允许,就不要尝试缓存所有文件吗? - Nasenbaer
4个回答

41

正如你链接到的问题所示,你需要调用BeginInit和EndInit方法,并设置UriSource属性,就像这样:

Dim bmi As New BitmapImage()
bmi.BeginInit()
bmi.CacheOption = BitmapCacheOption.OnLoad
bmi.UriSource = New Uri(fiInfo.FullName, UriKind.Absolute)
bmi.EndInit()

谢谢您的快速回复,关于我的关键字和使用VB而不是C#的问题。现在运行得非常好! - Nasenbaer
有没有一种严格使用XAML的方法来实现这个? - TrustyCoder

9

从文件中读取BitmapImage,并使用MemoryStream重新编写它:

MemoryStream ms = new MemoryStream();
BitmapImage bi = new BitmapImage();
byte[] bytArray = File.ReadAllBytes(@"test.jpg");
ms.Write(bytArray, 0, bytArray.Length);ms.Position = 0;
bi.BeginInit();
bi.StreamSource = ms;
bi.EndInit();
image.Source = bi;

谢谢Navid的快速回复。据我所见,那样做是可行的。在我的情况下,我现在使用bmi.EndInit()方法+ OnLoad,这样会更简单一些。 - Nasenbaer
现在,谁拥有MemoryStream对象实例并负责处理它? - Henrik
1
无论如何...如何解锁文件并删除它? - NoWar

3
我遇到了类似的问题,并且用了这个方法解决: (这是一个答案的个性化定制
    public static BitmapImage BitmapFromUri(Uri source)
    {
        var bitmap = new BitmapImage();
        bitmap.BeginInit();
        bitmap.UriSource = source;
        bitmap.CacheOption = BitmapCacheOption.OnLoad;
        bitmap.EndInit();
        return bitmap;
    }

您可以这样打开图片:

BitmapImage bimg = BitmapFromUri(new Uri(some_URI));

它在加载完图像后立即释放图像。

希望这有所帮助!


1
BitmapFrame.Create(new Uri(filePath), BitmapCreateOptions.None, BitmapCacheOption.OnLoad);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接