【问题标题】:Save the JPG file, A generic error occurred in GDI+保存 JPG 文件,GDI+ 中发生一般错误
【发布时间】:2014-06-16 08:45:06
【问题描述】:

我正在尝试保存 JPEG 图像,但出现错误:“GDI+ 中发生一般错误”
我尝试了以下代码:

Bitmap b = new Bitmap(m_image.Width, m_image.Height);
Graphics g = Graphics.FromImage((Image)b);
g.InterpolationMode = InterpolationMode.HighQualityBicubic;

g.DrawImage(m_image, 0, 0, m_image.Width, m_image.Height);
g.Dispose();

Image img1 = (Image)b;
img1.Save(Filename, ImageFormat.Jpeg);
m_image.Save(Filename, ImageFormat.Jpeg);

m_image.save(filename, ImaheFormat.Jpeg);

【问题讨论】:

  • 错误出现在哪里?你在处理位图吗?
  • 您是否在程序中加载带有Image.FromFile(Filename) 的图像?
  • 是的,我们在我的代码中使用了 m_image = Image.FromFile(file.FullName)。有什么问题吗?
  • 可能与您的问题无关,但 GDI+ 对其资源的处置非常挑剔。您的示例代码中没有 using 语句,在处理 10000 张图像后,您的程序很可能会因为您没有释放 GDI Handles 而开始抛出错误。

标签: c# .net gdi+ bmp


【解决方案1】:

根据Image.FromFile 的 MSDN 文档,此方法会锁定文件。

文件保持锁定状态,直到图像被释放。

所以如果你使用这样的东西

var image = Image.Load(fileName);
// ...
image.Save(fileName)

它会抛出异常,因为文件仍然被锁定。

您可以通过不使用此方法加载图像来解决此问题,而是使用采用Stream 参数的重载之一:

Image image;
using (var stream = File.OpenRead(fileName))
{
    image = Image.FromStream(stream);
}
// ...
image.Save(fileName);

我使用上面的代码没有任何问题,但Image.FromStream 的文档说

您必须在图像的生命周期内保持流打开。

如果您遇到任何问题,可以将文件加载到 MemoryStream 并保持打开状态。

【讨论】:

  • 我已按照您的建议更改了代码,但仍然遇到同样的错误。
  • @kiriti 尝试将其保存到另一个文件名,如果可行,那么您知道要保存的文件仍处于锁定状态。
  • 我已经更改了我的文件名,我已经尝试过,但没有运气先生.. 这里实际响应我们正在转换为数组字节,对于图像转换,我们再次转换为流,然后我们保存文件。如果您需要这方面的任何信息,请告诉我..
  • 我已经改成 m_image = Image.FromStream(stream);但同样的错误。
  • @kiriti 恐怕我帮不了你。如果您无法将图像另存为任何文件名(仅更改您保存的文件名,而不是您正在加载的文件名),那么问题完全出在其他地方。
【解决方案2】:

更改保存文件 认为 文件名 = "c:\1.jpg";

img1.Save("c:\2.jpg", ImageFormat.Jpeg); m_image.Save("c:\3.jpg", ImageFormat.Jpeg); 确保你有写权限。

我有以下示例运行完美

 Image m_image = Image.FromFile(Filename);
            Bitmap b = new Bitmap(m_image.Width, m_image.Height);
            Graphics g = Graphics.FromImage((Image)b);
            g.InterpolationMode = InterpolationMode.HighQualityBicubic;

            g.DrawImage(m_image, 0, 0, m_image.Width, m_image.Height);

            Image img1 = (Image)b;
            img1.Save("C:\\1.jpg", ImageFormat.Jpeg);
            m_image.Save("C:\\2.jpg", ImageFormat.Jpeg);

【讨论】:

  • 我已经尝试过您的建议,同样的问题:GDI+ 中发生一般错误。我得到了。
猜你喜欢
  • 2019-01-02
  • 2010-12-12
  • 2013-09-26
  • 1970-01-01
  • 2015-07-02
  • 1970-01-01
  • 1970-01-01
  • 2020-10-29
  • 1970-01-01
相关资源
最近更新 更多