如何在c#中

时间:2016-04-27 05:04:04

标签: c# image crop system.drawing

我正在尝试使用(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()时,我没有得到上述错误,我可以保存它。但它保存了具有给定宽度和高度的空白图像。

任何人都可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:7)

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();
}