2013-02-05 113 views
1

当我尝试使用System.IO.File.Delete(....)删除图像时,我得到错误异常。C#图像裁剪大小删除

IOException was unhandled by user code

The process cannot access the file 'xxx\image\6132_15658422-b0a1-45a9-b0f9-7e9af783ad53_Temp.jpg' because it is being used by another process.

任何人都可以请给我建议?



我的主要功能裁剪,调整大小和C#中删除图像。

int X1 = 70, Y1 = 20, X2 = 201, Y2 = 236, w = 800, h = 600; 
    string filelocation = "image/6132_15658422-b0a1-45a9-b0f9-7e9af783ad53_Temp.jpg"; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     try 
     { 
      using (System.Drawing.Image _Image = cropImage(
               ResizeImage(
                 System.Drawing.Image.FromFile(Server.MapPath("~") +"/"+ filelocation), w, h), 
                 (new System.Drawing.Rectangle(X1, Y1, X2, Y2)))) 
      { 
       _Image.Save(Server.MapPath("~") + "/" + "image/output.jpg"); 

      } 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
     finally { 
      File.Delete(Server.MapPath("~") + "/" + filelocation); 
     } 
    } 

对于裁切图像功能,

public System.Drawing.Image cropImage(System.Drawing.Image image, Rectangle cropArea) 
    { 
     try 
     { 
      Bitmap bmpImage = new Bitmap(image); 
      Bitmap bmpCrop = bmpImage.Clone(cropArea, 
      bmpImage.PixelFormat); 
      return (System.Drawing.Image)(bmpCrop); 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
    } 

对于调整图像大小功能,

public System.Drawing.Image ResizeImage(System.Drawing.Image image, int maxWidth, int maxHeight) 
    { 
     try 
     { 
      var ratioX = (double)maxWidth/image.Width; 
      var ratioY = (double)maxHeight/image.Height; 
      var ratio = Math.Min(ratioX, ratioY); 

      var newWidth = (int)(image.Width * ratio); 
      var newHeight = (int)(image.Height * ratio); 

      var newImage = new Bitmap(newWidth, newHeight); 
      Graphics.FromImage(newImage).DrawImage(image, 0, 0, newWidth, newHeight); 

      return newImage; 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 

    } 

[更新]

最后我改正我的问题,因为@landenedge建议,

  using (var mainImage = System.Drawing.Image.FromFile(Server.MapPath("~") +"/"+ filelocation)){ 
       using (System.Drawing.Image _Image = cropImage(
                ResizeImage(mainImage, w, h), 
                  (new System.Drawing.Rectangle(X1, Y1, X2, Y2)))) 
       { 
        _Image.Save(Server.MapPath("~") + "/" + "image/output.jpg"); 

       } 
      } 
+1

提示:“它正在被另一个进程使用”... –

+0

是的,但我不知道哪个进程已被使用... –

+0

可能是您自己的:运行ProcessMonitor ...它是免费的 –

回答

1

您需要处理您使用FromFile()创建的Image。尝试是这样的:

using (var mainImage = Image.FromFile(Server.MapPath("~") +"/"+ filelocation), w, h)) 
using (var _Image = cropImage(ResizeImage(mainImage, new Rectangle(X1, Y1, X2, Y2)))) 
{ 
    _Image.Save(Server.MapPath("~") + "/" + "image/output.jpg"); 
} 

另外,不要用throw ex;重新抛出异常 - 这样重置堆栈跟踪,可撤销有价值的调试信息。相反,只需使用throw;

+0

@landenedge,最后你纠正我的问题。 –

+0

非常感谢@landenedge。 –

2

即使您将所有Dispose()声明进行匹配后,您仍会发现仍有问题。在任何大量网站中,Image.FromFile都有问题。解决方法是使用Image.FromStream

using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read)) 
    { 
    using (Image original = Image.FromStream(fs)) 
    { 
     ... 

使用一个明确的Dispose(),一个using()陈述或将该值设置为null,直到垃圾收集发生不能解决问题。强制垃圾收集通常是一个糟糕的主意。

+0

关于Image.FromFile与Image.FromStream的明显建议,感谢@Ian Mercer –