GDI+ 中发生一般性错误(在 OutputStream 中保存 PNG 格式图像时遇到的问题)

一、症状:

在将图片以 PNG 格式保存至 Response.OutputStream 时,会碰到如下错误:

GDI+ 中发生一般性错误。

二、症状实例:

GDI+ 中发生一般性错误。

说明: 执行当前 Web 请求期间,出现未经处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
异常详细信息: System.Runtime.InteropServices.ExternalException: GDI+ 中发生一般性错误。
源错误: 

行 56: txtWatermarker.Position = model.CopyrightPosition;
行 57: txtWatermarker.AddWatermark();
行 58: txtWatermarker.WatermarkedImage.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Png);
行 59: txtWatermarker.Dispose();
行 60: return Response.OutputStream;

源文件: C:\Inetpub\wwwroot\zizhujy\Controllers\WatermarkController.cs    行: 58

三、原因:

在写 PNG 格式的图像时,指针需要在存储的位置来回移动。而 Response.OutputStream 只支持顺序访问。

四、解决方案:

先将 PNG 格式的图像保存至内存(内存总是可以随机访问的,即指针可以在内存中的存储位置来回移动),再将内存的存储内容复制写入 Response.OutputStream 中。

五、解决方案实例:

如以上的代码,改写为如下代码后,即不复出现该错误。

行 56: txtWatermarker.Position = model.CopyrightPosition;
行 57: txtWatermarker.AddWatermark();
行 58: MemoryStream mem = new MemoryStream();
行 59: txtWatermarker.WatermarkedImage.Save(mem, ImageFormat.Png);
行 60: //txtWatermarker.WatermarkedImage.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
行 61: Response.ContentType = "image/*";
行 62: mem.WriteTo(Response.OutputStream);
行 63: mem.Dispose();
行 64: txtWatermarker.Dispose();
行 65: return Response.OutputStream;

[donate:www.zizhujy.com]

Add comment

Loading