Image.FromStream 加载图片抛出OutOfMemoryException

项目上有一个功能是往一个第三方的电子病历编辑器中插入图片,第一次插入时正常显示。第二次三次之后再插入,就会报OutOfMemoryException。。。

ba100e33123c45d39985b8f1d27e09b0.png

 查看了下Image.FromStream方法的官方文档,当流不是一个有效的图像格式时会报OutOfMemoryException的异常,如下图红框部分。 

2f7e26c4e2824584a370ed9951f0d7cf.png

很明显实际的原因并不是这个。因为我第一次可以正常把图片插入进去,第二次就不行了。

由于第三方的编辑器代码是混淆的,也没有去深究了。

推测应该是插入图片后没有释放掉图片资源,尤其是插入尺寸比较大的图片时,这个错误发生的几率变高。

解决办法

解决不了第三方类库的问题,那么我们就从自己的代码上着手。

好在它支持传递Image对象的重载方法(上述报错的代码是使用传递文件路径的方法),

那我们可以自行加载图片,然后把图片压缩尺寸,再把压缩后的图片传递给第三方类库就好了。

压缩图片的代码如下:

/// <summary>
/// 压缩图片
/// </summary>
/// <param name="imageStream">图片文件流</param>
/// <param name="size">指定压缩后的尺寸(像素)</param>
/// <returns>压缩后的图片</returns>
public static Image Compress(Stream imageStream, Size size)
{
	using (var img = Image.FromStream(imageStream))
	using (var bitmap = new Bitmap(size.Width, size.Height))
	using (var g = Graphics.FromImage(bitmap))
	{
		g.Clear(Color.Transparent);
		g.CompositingQuality = CompositingQuality.HighSpeed;
		g.SmoothingMode = SmoothingMode.HighSpeed;
		g.InterpolationMode = InterpolationMode.Low;
		g.DrawImage(img, new Rectangle(0, 0, size.Width, size.Height), 0, 0, img.Width, img.Height, GraphicsUnit.Pixel);

        var memStream = new MemoryStream()
		bitmap.Save(memStream, img.RawFormat);
		return Image.FromStream(memStream);
	}
}

调用代码如下:

//加载图片文件流
using (var imgStream = new FileStream(文件名路径, FileMode.Open, FileAccess.Read, FileShare.Read))
{
    //按指定尺寸压缩图片
	var img = Compress(imgStream, new Size(280, 384));
    //插入图片
	InsertImage(img);
}

至此完美解决,插入了十多张10MB以上的图片也没有报错了

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
**System.OutOfMemoryException 是当系统没有足够的内存继续执行程序时引发的异常**。 这个异常通常出现在应用程序尝试分配更多内存,但可用内存不足时。例如,如果一个应用程序试图创建一个大对象数组或者一个 StringBuilder 对象超过了其 MaxCapacity 属性定义的长度,而系统无法提供所需的连续内存空间,就会抛出此异常。 在ASP.NET环境中,System.OutOfMemoryException可能由于IIS进程使用的内存超过了配置的上限而导致。在machine.config文件中,<processModel>元素有一个memoryLimit属性,该属性指定了ASP.NET进程可以使用的物理内存百分比。默认情况下,这个值被设置为60%,即ASP.NET进程最多只能使用总物理内存的60%。如果超出这个限制,IIS会尝试通过回收(recycle)旧进程并创建新进程来处理请求,但如果系统为每个进程能够分配的最大内存量(如在Win32系统中通常是2GB)已经被使用完,即使实际的内存使用没有达到memoryLimit设置的百分比,也可能会引发OutOfMemoryException。 解决此类问题的方法包括增加服务器物理内存、优化应用程序以减少内存消耗、调整memoryLimit的值,或者在编写代码时确保及时释放不再需要的对象以释放内存。 需要注意的是,即使进行了这些调整,也不能保证完全避免OutOfMemoryException的发生,因为可能还有其他因素导致内存不足,比如内存回收操作耗时太多等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值