GDI+例外时,保存图像在PNG格式

本文关键字:图像 PNG 格式 保存 GDI+ | 更新日期: 2023-09-27 18:05:07

. NET应用程序在我的服务器上运行几天后开始抛出GDI+异常。在我重新启动服务器后,所有工作正常几天,然后突然这个异常再次发生。在第一次发生之后,每次我尝试保存PNG图像时都会发生这种情况,直到我重新启动。

当我尝试将图像保存为JPEG时,效果很好。

当我从我的项目中运行这段代码时,它失败了:

var path = @"C:'Project'images'logo.png";
var image = Image.FromFile(path);
using (var ms = new MemoryStream())
{
    image.Save(ms, ImageFormat.Png);     // Fails here on GDI+ exception.
    //image.Save(ms, ImageFormat.Jpeg);  // JPEG works somehow
}

再次:当我重新启动远程桌面并运行这段代码时,它工作了几天,然后突然开始一次又一次地失败。

我试着:

  1. 用相同的代码创建一个控制台应用程序,并在项目所在的RDP中运行它。它工作得很好!

  2. 在我读过的关于这个主题的10多篇文章中,有很多不同的代码变体。

  3. GCI.Collect() - no help.

  4. 检查所有有写权限的文件夹(可能是IIS出了问题?)

我认为它应该是一些配置突然改变由于某些东西,我不明白它可能是什么

GDI+例外时,保存图像在PNG格式

在我重新启动服务器后,所有工作正常了几天,然后突然出现这个异常,在第一次发生之后,每次我试图保存PNG图像时都会发生,直到我重新启动。

听起来像是内存泄漏。编译成。net的哪个版本?运行在哪个服务器操作系统上?

你可以先把你的图片放在using块中:

var path = @"C:'Project'images'logo.png";
using (Image image = Image.FromFile(path))
{
    using (var ms = new MemoryStream())
    {
        image.Save(ms, ImageFormat.Png);
    }
}

我相信这个链接与你的情况有关。

它抛出GDI+错误,因为您的对象之一未被处置,所以最好处置已使用的对象

如果你得到这个错误,那么我可以说你的应用程序没有对某个目录的写权限。

GDI+限制图像高度为65534

总是倾向于使用 using语句。它永远不会忘记处理对象,即使代码抛出异常。

var path = @"C:'Project'images'logo.png";
using (Image image = Image.FromFile(path))
{
      using (var ms = new MemoryStream())
      {
            image.Save(ms, ImageFormat.Png); //fails here on GDI+ exception.
            //image.Save(ms, ImageFormat.Jpeg); //Jpeg Works somehow
      }
}
FromFile方法锁定了文件,所以使用image . fromstream()方法读取图像:
byte[] bytes = System.IO.File.ReadAllBytes(filename);
System.IO.MemoryStream ms = new System.IO.MemoryStream(bytes);
using (var ms = new MemoryStream())
{
      image.Save(ms, ImageFormat.Png); //fails here on GDI+ exception.
      //image.Save(ms, ImageFormat.Jpeg); //Jpeg Works somehow
}

基本上,如果你有一次性对象…处理掉他们!图像是一次性的,像位图一样,它使用windows资源。如果不进行处置,则在关闭应用程序之前不会释放windows资源。因此,您需要处理任何实例化的图像。