C# 图像旋转存储器错误
我在C# 图像旋转存储器错误,c#,asp.net,image,C#,Asp.net,Image,我在C#中使用了一个简单的Image.RotateFlip()方法,但我一直收到一个错误,说“内存不足”。我通过探查器运行它,发现它发生在System.Drawing.Image.FromFile()上 这是我的密码: protected void rotatePic(object sender, EventArgs e) { ImageButton img = sender as ImageButton; string url = img.ImageU
C#
中使用了一个简单的Image.RotateFlip()
方法,但我一直收到一个错误,说“内存不足”。我通过探查器运行它,发现它发生在System.Drawing.Image.FromFile()上
这是我的密码:
protected void rotatePic(object sender, EventArgs e)
{
ImageButton img = sender as ImageButton;
string url = img.ImageUrl.Split('?')[0];
System.Drawing.Image pic = System.Drawing.Image.FromFile(Server.MapPath(url));
pic.RotateFlip(System.Drawing.RotateFlipType.Rotate270FlipNone);
pic.Save(Server.MapPath(url));
pic.Dispose();
img.ImageUrl = img.ImageUrl + "?" + DateTime.Now.ToString();
}
你的问题缺乏很多相关信息。第一;图像有多大。第二,如何调用此代码。经常打电话吗?您什么时候在
pic
上调用Dispose()
?实现IDisposable
,因此您的代码应该(可能)如下所示:
using(var pic = System.Drawing.Image.FromFile(Server.MapPath(url)))
{
pic.RotateFlip(System.Drawing.RotateFlipType.Rotate270FlipNone);
pic.Save(Server.MapPath(url));
}
如果你多次这样做,你不应该忘记处理()你的图像。图像有多大?@Quibblesome它们总是不同,但最大的在4MB以下。很可能OOM是真的。也就是说,您正在运行OOM,特别是如果Ed S是正确的,并且您没有正确处理图像。最好的方法是附加.NET内存分析器并检查堆(如果在代码中不明显的话)。虽然我在System.Drawing中遇到过不正确的OOM,但它们通常在操作系统定制较差的移动设备上出现。因此,在认为API可能有问题之前,先对其进行分析,并对代码进行三次检查。是的,一个好的内存分析工具可以让您在遇到OOM情况时的生活变得更加轻松。我喜欢红门蚂蚁档案。它有一个免费试用版。我会尝试使用它。@StørmShadøws:仍然没有回答这些问题:“第一,图像有多大。第二,这个代码是如何调用的。”另外,使用
using
语句。如果RotateFlip
或Save
抛出,则不调用Dispose()
。图像大小因上载到服务器而不同。图像的最大大小为4MB。正在对图像单击调用代码。@StørmShadøws:好的,在某些图像中这种情况更常见吗?您确定没有太频繁地调用此代码吗?通过已经执行的调试,您有没有收集到任何有用的信息?调用它的机会非常少,被调用的几率是250张图片中的1张。我尝试了上面的代码,但仍然出现此错误,即使使用pic.Dispose();我补充说,但这被称为的几率是每250张图片中就有一张。所以我相信这不是问题所在。