当前位置: 首页 > news >正文

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

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

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

原代码:

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,然后关闭图像文件并释放占用图像资源;

代码如下:

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;  
}

调用方法:

image1.Source = GetImage(path); // path为图片路径

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


http://www.mrgr.cn/news/83014.html

相关文章:

  • Vue 组件开发:构建高效可复用的 UI 构建块
  • 数据库语句学习
  • 51c大模型~合集102
  • 121 买入股票的最佳时机
  • 【cuda学习日记】2.1 2D matrix操作
  • Apache Traffic存在SQL注入漏洞(CVE-2024-45387)
  • docker 常用命令实践DEMO
  • Power BI如何连接Azure Databricks数据源?
  • 新华三H3CNE网络工程师认证—常见操作指令总结
  • oracle位运算、左移右移、标签算法等
  • C++ 11,14,17 新特性
  • 入门嵌入式(四)——IICOLED
  • 阿尔法linux开发板ping不通百度
  • STM32之CAN通讯(十一)
  • 总结 Vue 请求接口的各种类型及传参方式
  • halcon三维点云数据处理(八)3D模型匹配相关函数
  • List ---- 模拟实现LIST功能的发现
  • MBTiles 及爬取到发布与数据转换
  • torch.max和torch.softmax python max
  • 【算法】字符串算法技巧系列