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
}
再次:当我重新启动远程桌面并运行这段代码时,它工作了几天,然后突然开始一次又一次地失败。
我试着:
用相同的代码创建一个控制台应用程序,并在项目所在的RDP中运行它。它工作得很好!
在我读过的关于这个主题的10多篇文章中,有很多不同的代码变体。
GCI.Collect() - no help.
检查所有有写权限的文件夹(可能是IIS出了问题?)
。
我认为它应该是一些配置突然改变由于某些东西,我不明白它可能是什么
在我重新启动服务器后,所有工作正常了几天,然后突然出现这个异常,在第一次发生之后,每次我试图保存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资源。因此,您需要处理任何实例化的图像。