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

C# 图片加载引发的内存溢出异常

在c#中,使用下面代码将图片读取到内存,发现内存暴涨;由于现场图片切换较快,进而导致了现场程序跑了不久便报内存溢出异常了。

public static System.Windows.Media.Imaging.BitmapImage ByteArrayToBitmapImage(this byte[] array)
{using (var ms = new System.IO.MemoryStream(array)){try{var image = new System.Windows.Media.Imaging.BitmapImage();image.BeginInit();image.CacheOption = System.Windows.Media.Imaging.BitmapCacheOption.OnLoad; // hereimage.StreamSource = ms;image.EndInit();image.Freeze();return image;}catch (Exception ex){LogHelper.Error(ex);}return null;}
}

图片加载到内存会占用多少内存?

答案:不一定,因为需要看你的处理方式。如上面的代码,并未进行额外处理,系统会进行下面的处理:

  • 将300kb的数据读入内存
  • 以原始分辨率进行解码,解码后会变成未压缩的位图,公式为:宽度×高度×每像素字节数 。举个例子:假如你的图片分辨率为 1920*1080 ;那么解码后占用内存可能为 1920*1080*4 ≈ 7.9MB
  • 如果这个图片用于WPF的Image控件展示,还会有更多的内存开支。

如何正确处理图片以应对内存占用?

答案:要设置解码高度与宽度,拿WPF的Image控件来说,解码宽度与高度就是你的Image的真实高宽--ActualWidth、ActualHeight

// 在你的方法中添加信息输出
public static BitmapImage ByteArrayToBitmapImage(this byte[] array, int iPicWid = 0 )
{using (var ms = new MemoryStream(array)){try{var image = new BitmapImage();image.BeginInit();image.CacheOption = BitmapCacheOption.OnLoad;image.StreamSource = ms;// 设置解码宽度 避免以无损方式解码if (iPicWid > 0) image.DecodePixelWidth = iPicWid ;image.EndInit();image.Freeze();// 调试信息#if DEBUGPrintImageInfo(image);#endifreturn image;}catch (Exception ex){LogHelper.Error(ex);return null;}}
}// 在调试时输出详细信息
public static void PrintImageInfo(BitmapImage image)
{Console.WriteLine("=== 图像信息 ===");Console.WriteLine($"宽度: {image.PixelWidth} 像素");Console.WriteLine($"高度: {image.PixelHeight} 像素");Console.WriteLine($"格式: {image.Format}");Console.WriteLine($"每像素位数: {image.Format.BitsPerPixel}");int bytesPerPixel = (image.Format.BitsPerPixel + 7) / 8;Console.WriteLine($"每像素字节数: {bytesPerPixel}");long totalBytes = image.PixelWidth * image.PixelHeight * bytesPerPixel;Console.WriteLine($"总内存占用: {totalBytes} 字节 ({totalBytes / 1024.0 / 1024.0:F2} MB)");// 如果是文件加载的,还可以显示原始文件大小if (image.StreamSource != null){Console.WriteLine($"压缩格式: 已压缩");}
}

我拿了一个300kb大小的图片,测试代码如下:
ByteArrayToBitmapImage(buffer);
输出信息如下:

=== 图像信息 ===
宽度: 2560 像素
高度: 1440 像素
格式: Bgr32
每像素位数: 32
每像素字节数: 4
总内存占用: 14745600 字节 (14.06 MB)
压缩格式: 已压缩

参考

WPF 解决Image控件读取高分辨率图片并缩放占用内存过大
How to: Use a BitmapImage
WPF的BitmapImage的文件无法释放及内存泄露的问题

http://www.gsyq.cn/news/63206.html

相关文章:

  • Mac 安装 4K Video Downloader v5.0.0.5303-1.dmg 方法(附安装包)
  • TPS的另外一层含义:绝对并发用户数 - BKY007
  • 笔记——OI中求逆元的几种方式(不含数学知识的讲解)
  • 2025国内公关公司排名推荐(整合权威数据源):十大机构深度对比,专业分析与选择指南
  • acme证书申请
  • [CEOI 2025] Equal Mex 题解
  • Open WebUI大模型输出完成后新对话响应延迟、输出变慢问题
  • 2025年11月液体容器磁致伸缩液位计,格雷母线,lvdt位移传感器厂家最新推荐,容器监测与位移适配指南
  • Python中isdigit、isdecimal、isnumeric区别详解
  • 3D 场景预加载应用实现 | 图扑软件
  • 2025年11月GEO公司推荐:全链路破局企业流量困境,AI驱动搜索优化实力全解析
  • 医疗器械渠道管理革新:数字化平台如何解决行业痛点
  • 如何在VSCode中Debug(带有参数,name、program、$file、args、pickArgs、指定虚拟环境)
  • 适合应届生:零经验专业简历模板TOP4
  • 2025年简约智能家居照明灯品牌推荐,让生活更智能
  • [论文阅读] AI | 大语言模型服务框架服务级目标和系统级指标优化研究
  • 2025年11月治鼻炎产品推荐:高性价比解决方案与市场热门排行榜
  • 蓝牙音频协议——安卓开发
  • 2025年11月治鼻炎产品推荐:一份详尽的清单与选择指南
  • 成为中国中小制造业企业数字营销领域的引领者 ——纪实西安动力无限的信息化赋能之路
  • SKI欧洲原装进口瓷砖:汇聚国际匠心,打造高端家居空间
  • Java NIO框架和传统的IO框架有什么区别?
  • 如何在Java中使用NIO框架?
  • 为什么说白瑞芳是最适合基础巩固的高中数学老师?
  • 别再闹笑话了!OpenPLC ≠ PLCopen,一文讲透真正的区别
  • 全自动工业滤水器厂家推荐:连云港华博与博璟源的专业之选
  • 美容院选择皮肤检测仪的5大标准:安德颜析MINI如何满足专业需求
  • 完整教程:集群环境安装与部署 Hadoop
  • 2025年下半年特氟龙喷涂、聚四氟乙烯喷涂、陶瓷喷涂、碳化钨喷涂、聚四氟乙烯管道设备厂家口碑推荐
  • 251127