在保存图像时发生了一个通用的GDI+错误。

3
亲爱的专家,我在保存图片时遇到了错误,代码如下:
  ClsImageManager objImgManager = new ClsImageManager();
  Bitmap ImageBitmap = objImgManager.GetBitmapFromBytes(ImageData);
  Response.ContentType = "image/tiff";
  ImageBitmap.Save(Response.OutputStream, ImageFormat.Tiff);
  ImageBitmap.Dispose();
  Response.End();

当我使用Image.format.jpeg时,代码正常运行,但当我将其更改为ImageFormat.Tiff时,我遇到了一个错误在gdi+中发生了一般性错误。


花了好几个小时追踪这个问题,结果发现我看到的不是真正的错误信息。我的服务器有一个关于上传文件磁盘空间配额的限制,因此无法保存图像,从而导致了gdi+异常。 - The Muffin Man
2个回答

4
请注意,GDI/GDI+(System.Drawing 命名空间)在 ASP.NET 中没有官方支持 - 请参阅“注意事项”:http://msdn.microsoft.com/en-us/library/system.drawing.aspx
应该使用WIC代替GDI+(请参阅:http://weblogs.asp.net/bleroy/archive/2009/12/10/resizing-images-from-the-server-using-wpf-wic-instead-of-gdi.aspx)。
虽然如此,许多人已经成功地在ASP.NET中使用了GDI+。最可能的是,您应该尝试将图像保存到内存流(或文件)中,然后将保存的图像写入响应。有关详细信息,请参见此链接:http://www.west-wind.com/weblog/posts/2006/Oct/19/Common-Problems-with-rendering-Bitmaps-into-ASPNET-OutputStream 另一种解决方法可能与用户帐户有关。显然,GDI/GDI+ 绑定到设备上下文(屏幕、打印机等),可能在服务帐户下不可用。因此,如果有助于解决问题,您可以尝试在某些普通用户帐户上运行ASP.NET代码。

2
您可能需要尝试显式编码图像保存。请查看MSDN文档底部的代码示例,了解Image.Save方法的使用。Image.Save Method (String, ImageCodecInfo, EncoderParameters)。同样的操作也可以应用于您的保存。
然而,可能是因为您的objImgManager在您保存之前处置了存储图像的缓冲区。
Bitmap ImageBitmap = objImgManager.GetBitmapFromBytes(ImageData);

您可以通过以下方式创建图像的副本来解决这个问题:
Bitmap ImageBitmap = new Bitmap(objImgManager.GetBitmapFromBytes(ImageData));

这个解决方法解决了我在将TIFF转换为JPG时遇到的GDI+通用错误问题。谢谢! - Tomino

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接