保存jpeg - 进程无法访问该文件,因为它正在被另一个进程使用?

问题描述 投票:2回答:1

我试图使用(x,y)坐标、宽度和高度裁剪一个jpeg文件,并将输出保存在同一位置(即替换)。我尝试了下面的代码,但它不工作。

public void CropImage(int x, int y, int width, int height)
{

string image_path = @"C:\Users\Admin\Desktop\test.jpg";

var img = Image.FromFile(image_path);

Rectangle crop = new Rectangle(x, y, width, height);

Bitmap bmp = new Bitmap(crop.Width, crop.Height);
using (var gr = Graphics.FromImage(bmp))
{
    gr.DrawImage(img, new Rectangle(0, 0, bmp.Width, bmp.Height), crop, GraphicsUnit.Pixel);
}


if (System.IO.File.Exists(image_path))
{
    System.IO.File.Delete(image_path);
}

bmp.Save(image_path, ImageFormat.Jpeg);
}

这给出了一个错误,如。

在mscorlib.dll中发生了一个类型为 "System.IO.IOException "的异常,但在用户代码中没有被处理。

补充信息。进程无法访问文件 "C:\Users\Admin\Desktop\test.jpg",因为它正在被另一个进程使用。

当我添加 img.Dispose() 我没有出现上面的错误,我可以保存它.但它保存的是给定宽度和高度的空白图片。

谁能帮我解决这个问题?

c# image crop system.drawing
1个回答
8
投票
public void CropImage(int x, int y, int width, int height)
{
    string imagePath = @"C:\Users\Admin\Desktop\test.jpg";
    Bitmap croppedImage;

    // Here we capture the resource - image file.
    using (var originalImage = new Bitmap(imagePath))
    {
        Rectangle crop = new Rectangle(x, y, width, height);

        // Here we capture another resource.
        croppedImage = originalImage.Clone(crop, originalImage.PixelFormat);

    } // Here we release the original resource - bitmap in memory and file on disk.

    // At this point the file on disk already free - you can record to the same path.
    croppedImage.Save(imagePath, ImageFormat.Jpeg);

    // It is desirable release this resource too.
    croppedImage.Dispose();
}
© www.soinside.com 2019 - 2024. All rights reserved.