C#将图像保存到文件系统,gdi +错误

时间:2018-07-09 09:13:36

标签: c#

我有一个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()的替代方法?

感谢您的帮助!

1 个答案:

答案 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);
                }
            }
        }
    }
}