2013-02-22 77 views
1

我在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(); 
    } 
+0

图像有多大? – Quibblesome 2013-02-22 23:31:26

+0

@Quibblesome他们总是不同,但最大的是4MB以下。 – 2013-02-22 23:34:01

+0

很可能OOM是真实的。那就是你正在运行OOM,特别是如果Ed S是正确的,而且你没有正确处理图像。找出(如果它在代码中不明显)的最好方法是附加.NET内存分析器并检查堆。虽然我在System.Drawing中遇到过不正确的OOM,但它们通常位于具有定制性差的操作系统的移动设备上。因此,在认为API可能不合适之前,先对其进行配置并三重检查您的代码。 – Quibblesome 2013-02-22 23:36:18

回答

3

你的问题缺乏大量的相关信息。第一;形象有多大。其次,这个代码是如何被调用的。它是否经常被调用?您何时致电pic致电Dispose()System.Drawing.Image实现IDisposable,所以你的代码应该(可能)是这样的:

using(var pic = System.Drawing.Image.FromFile(Server.MapPath(url))) 
{ 
    pic.RotateFlip(System.Drawing.RotateFlipType.Rotate270FlipNone); 
    pic.Save(Server.MapPath(url)); 
} 
+0

请检查编辑。 – 2013-02-22 23:35:36

+0

@StørmShadøws:还没有回答这些问题:*“首先,图像有多大,其次,这个代码是如何被调用的。”*另外,使用'using'语句。如果'RotateFlip'或'Save'抛出,则不要调用'Dispose()'。 – 2013-02-22 23:36:23

+0

图像大小因为上传到服务器而有所不同。图像的最大尺寸是4MB。代码在图像点击时被调用。 – 2013-02-22 23:37:36

0

如果你是做了好几次,你不应该忘记的Dispose()图像。

+0

我补充说,但是这个被调用的几率在每250张图片中是1。所以我相信这不是问题。 – 2013-02-22 23:43:53