1

を使用してイメージを削除しようとするとSystem.IO.File.Delete(....)、エラー例外が発生します。

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");

                }
            }
4

2 に答える 2

2

すべてのステートメントを一致させた後でも、Dispose()まだ問題があることがわかります。 Image.FromFile大量の Web サイトでは問題になります。Image.FromStream解決策は、代わりに使用することです。

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

明示的な 、ステートメントを使用するDispose()using()、値を に設定しても、ガベージ コレクションが発生するまでnull 問題は解決しません。ガベージ コレクションを強制的に実行することは、一般的にはお勧めできません。

于 2013-02-05T05:33:10.853 に答える
1

Imageで作成した を破棄する必要がありますFromFile()。次のようなことを試してください:

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;ください。

于 2013-02-05T05:23:32.573 に答える