我们在ASP.NET MVC3中有图像上传的场景。
控制器
public ActionResult Upload(IEnumerable<HttpPostedFileBase> images, SomeViewModel model)
{
foreach(var i in images)
{
...
byte[] fileBytes = i.InputStream.GetBytesArray();
byte[] image = _imageManager.Resize(fileBytes, MaxImageWidth, MaxImageHeight, true);
...
}
}
ImageManager
public byte[] Resize(byte[] content, int width, int height, bool preserveAR = true)
{
if (content == null)
return null;
WebImage wi = new WebImage(content);
wi = wi.Resize(width, height, preserveAspectRatio);
return wi.GetBytes();
}
所以我们从客户端收到HttpPostedFileBase的图像。我们将byte [] fileBytes传递给imageManager的Resize方法。图像管理器正在创建新的WebImage实例,然后调整图像大小并再次将其转换为byte []。
调试此代码时,在我传递wi.GetBytes()行的那一刻,我的内存使用率急剧上升(至少500mb)。我上传10mb的图像。上传较小尺寸的照片(约1.5mb)时,内存消耗是正常的。
造成这种情况的原因是什么,可以通过某种方式解决吗?
谢谢
答案 0 :(得分:1)
引擎盖下,WebImage使用System.Drawing.Image.FromStream
获取原始图像流并将其转换为字节数组。我尝试使用6.0MB JPG并在其上调用该方法,然后我获得了一个6.0MB的流。如果我要求BMP,我会得到一个172MB字节的数据
我怀疑您正在上传压缩图像(例如PNG / JPG),而对GetBytes的调用会导致图像的解压缩字节可用。当解压缩成原始形式时,图像实际上可能实际上更大。没有太多可以做到的,以避免一直处理Stream对象,所以你永远不会一次将所有内容加载到内存中。