[英]GDI+ exception when saving image in PNG format
我的服务器上的ASP.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() - 没有帮助。
检查了所有具有写权限的文件夹(也许IIS有什么东西?)。
更多。
我认为它应该是一些突然因某些东西而改变的配置,我无法理解它是什么。
重新启动服务器后,所有工作正常几天,然后突然发生此异常,并在第一次发生后,每次我尝试保存PNG图像时都会发生,直到我将重新启动。
听起来像是内存泄漏给我。 这个编译的.NET版本是什么? 运行什么服务器操作系统?
您可以将图像封闭在使用块中:
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资源。 所以你需要处理任何实例化的图像。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.