【问题标题】:C# save image to file system, error in gdi+C# 将图像保存到文件系统,gdi+ 中的错误
【发布时间】:2018-07-09 09:13:36
【问题描述】:

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

感谢您的帮助!

【问题讨论】:

  • 您创建了这么多位图,但您并没有处理它们。每个IDisposable 都必须在你完成它们后显式处理。
  • 你为什么要使用 System.Drawing.Bitmap?它是 WinForms,而不是 WPF。

标签: c#


【解决方案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);
                }
            }
        }
    }
}

【讨论】:

  • 值得补充的是,任何实现IDisposable 的非托管资源(Bitmaps、RegKeys、Streams、DB Connection & Commands 等)任何对象都需要显式处置,使用模式有助于我们不要忘记。要查看一个类是否实现了IDisposable,请将鼠标光标放在它上面并按 F12
  • @Enigmativity 感谢您的帮助!我测试了你的代码,它运行良好。我有一个关于“使用”的问题:“使用”会自动处置对象还是我为什么不需要处置它?再次感谢
  • 它在其作用域的末尾调用object.dispose()stackoverflow.com/questions/212198/…
猜你喜欢
  • 1970-01-01
  • 2017-08-18
  • 1970-01-01
  • 2011-06-21
  • 1970-01-01
  • 1970-01-01
  • 2013-09-01
  • 2021-04-05
  • 2012-06-12
相关资源
最近更新 更多