我正在尝试使用(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()
时,我没有得到上述错误,我可以保存它。但它保存了具有给定宽度和高度的空白图像。
任何人都可以帮我解决这个问题吗?
答案 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();
}