【WPF】使用BitmapImage给Image的Source赋值,并释放原占用资源,避免删除原文件时导致程序崩溃

在WPF中使用BitmapImageImage控件的Source属性赋值时,有时会遇到文件资源被锁定的问题,这会导致尝试删除或修改源图像文件时出现异常。这是因为BitmapImage默认会保持对底层文件句柄的锁定,直到BitmapImage对象本身被释放。

为了避免这种情况,可以在加载图像后立即释放文件句柄。这可以通过设置BitmapImageCacheOption属性来实现,具体来说是将其设置为BitmapCacheOption.OnLoad。这个选项会让BitmapImage在加载完成之后就立即缓存位图数据,并且释放原始文件句柄。

原代码:

cs 复制代码
imgjpg.ImageSource = new BitmapImage(new Uri(path));

其中path为图像的原始路径。

问题描述:

在使用BitmapImage给Image的Source赋值时,如果不及时释放图像资源,那么会一直占用资源,如果此时操作原图像,那么很可能就会出现错误。从而导致程序崩溃。

错误信息:

捕捉到 System.Runtime.InteropServices.ExternalException

HResult=-2147467259

Message=GDI+ 中发生一般性错误。

Source=System.Drawing

ErrorCode=-2147467259

StackTrace:

在 System.Drawing.Image.Save(String filename, ImageCodecInfo encoder, EncoderParameters encoderParams)

在 System.Drawing.Image.Save(String filename, ImageFormat format)

转换图像为BitmapImage,然后关闭图像文件并释放占用图像资源;

代码如下:

cs 复制代码
public static BitmapImage GetImage(string imagePath)   
{  
    BitmapImage bitmap = new BitmapImage();  
    if (File.Exists(imagePath))   
    {  
        bitmap.BeginInit();  
        bitmap.CacheOption = BitmapCacheOption.OnLoad;  
        using (Stream ms = new MemoryStream(File.ReadAllBytes(imagePath)))   
        {  
            bitmap.StreamSource = ms;  
            bitmap.EndInit();  
            bitmap.Freeze();  // 在这里释放资源  
        }  
    }  
    return bitmap;  
}

调用方法:

cs 复制代码
image1.Source = GetImage(path); // path为图片路径

请注意,BitmapImage的Freeze方法会将资源从垃圾收集器中释放,因此不会对应用程序的内存使用造成负担。不过请注意,在使用Image控件的时候,最好能及时释放资源,避免造成内存泄露。

相关推荐
菜到极致就是渣1 小时前
C#中的关键字out和ref的区别
开发语言·c#
坐井观老天2 小时前
使用WPF在C#中制作下载按钮
开发语言·c#·wpf
CodeCraft Studio2 小时前
【实用技能】如何使用 .NET C# 中的 Azure Key Vault 中的 PFX 证书对 PDF 文档进行签名
c#·.net·azure
奔跑的犀牛先生2 小时前
unity学习14:unity里的C#脚本的几个基本生命周期方法, 脚本次序order等
学习·unity·c#
数据的世界014 小时前
C#标识符和关键字
java·服务器·c#
鲤籽鲲6 小时前
C# 整型、浮点型 数值范围原理分析
开发语言·c#
Moweiii11 小时前
Godot最佳实践个人转述
c#·游戏引擎·godot
小禾家的11 小时前
.NET AI 开发人员库 --AI Dev Gallery简单示例--问答机器人
人工智能·c#·.net
AitTech12 小时前
如何轻松反转C# List<T>中的元素顺序
windows·c#·list
军训猫猫头13 小时前
23.行号没有了怎么办 滚动条没有了怎么办 C#例子
开发语言·c#