我有一个C#WPF应用程序,可以将图像切成所需的尺寸。 WPF窗口用于输入用户ID,以将图像保存到数据库中。当我测试我的应用程序时,有时它会工作,有时会在将映像保存到文件系统的那一行上出现gdi +错误。
这是我的代码:
public static void CutImage(Image image)
{
//create new image
Bitmap source = new Bitmap(image);
//cut image
Bitmap cuttedImage = source.Clone(new System.Drawing.Rectangle(250, 0, 5550, 4000), source.PixelFormat);
//copy bitmap to avoid "general error in gdi+"
Bitmap copyImage = new Bitmap(cuttedImage.Width, cuttedImage.Height, PixelFormat.Format24bppRgb);
Graphics g = Graphics.FromImage(copyImage);
g.DrawImageUnscaled(cuttedImage, 0, 0);
//dispose graphics object
g.Dispose();
//dispose image
cuttedImage.Dispose();
//save image to filesystem
copyImage.Save(@"path\tmp.jpg", ImageFormat.Jpeg);
}
//get image
Image i = Image.FromFile(path\image.jpg);
//cut image
CutImage(i);
我搜索了一个解决方案,有人说我必须创建从Image.FromFile()获得的图像的副本。但是错误有时仍然会发生。我尝试了几次,当它发生时似乎是随机的。该错误始终在Image.Save()行上。
有人知道如何解决此问题,还是Image.Save()的替代方法?
感谢您的帮助!
答案 0 :(得分:1)
您正在创建很多位图,并且没有丢弃它们。完成操作后,必须明确处置每个IDisposable
。
尝试一下,看看错误是否消失:
public static void CutImage(Image image)
{
using (Bitmap source = new Bitmap(image))
{
using (Bitmap cuttedImage = source.Clone(new System.Drawing.Rectangle(250, 0, 5550, 4000), source.PixelFormat))
{
using (Bitmap copyImage = new Bitmap(cuttedImage.Width, cuttedImage.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb))
{
using (Graphics g = Graphics.FromImage(copyImage))
{
g.DrawImageUnscaled(cuttedImage, 0, 0);
copyImage.Save(@"path\tmp.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
}
}
}
}
}