当前位置: 首页 > 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.jsqmd.com/news/53213/

相关文章:

  • 实用指南:LV.5 文件IO
  • CSS视图过渡入门指南:让多页面应用拥有丝滑动画
  • 《ROS1学习笔记8——自定义服务素材》
  • 实用指南:逻辑回归(Logistic Regression)
  • CTIP 与 3D-IC 堆栈热行为仿真实践
  • Mac 安装 4K Video Downloader v5.0.0.5303-1.dmg 方法(附安装包)
  • 浮点数定点表示(Q格式)
  • TPS的另外一层含义:绝对并发用户数 - BKY007
  • P10547 [THUPC 2024 决赛] 排列游戏
  • NeurlPS 2025!多伦多大学TIRE助力3D/4D 生成精准保留主体身份
  • 笔记——OI中求逆元的几种方式(不含数学知识的讲解)
  • 2025国内公关公司排名推荐(整合权威数据源):十大机构深度对比,专业分析与选择指南
  • SpringBoot集成LangChain4j快速开发AI应用(调用阿里云Api) - 实践
  • 中美大数据产业的十年分岔路 - 智慧园区
  • acme证书申请
  • 【论文精读】DreamVideo:定制化主体与动作的视频生成技能
  • NOIP模拟赛11.27
  • Open WebUI大模型输出完成后新对话响应延迟、输出变慢问题
  • 2025年11月掘进机位移传感器,拦焦车位移传感器,推焦车位移传感器厂家最新推荐,焦化设备适配测评
  • 2025年11月辊缝位移传感器,切纸位移传感器,水坝闸门液压位移传感器厂家最新推荐,水利与造纸适配测评
  • 2025年11月起重机位移传感器,挖掘机位移传感器,压路机位移传感器厂家最新推荐,工程机械性能测评
  • Java大厂面试真题:Spring Boot微服务+Kafka消息队列+AIGC场景实战问答全解析 - 指南
  • 从被动审查到主动风控:文档抽取技术驱动合同管理范式转移
  • Python中isdigit、isdecimal、isnumeric区别详解
  • 2025年11月GEO公司推荐:全链路破局企业流量困境,AI驱动搜索优化实力全解析
  • CH584/CH585NFC调试相关
  • 租房买房必看2租房切忌“暗室”!这种房子阴气重、易生病,白送都别住!
  • 人工智能之数据分析 Matplotlib:第二章 Pyplot
  • 医疗器械渠道管理革新:数字化平台如何解决行业痛点
  • 性能验证问题汇总