一、症状:
在将图片以 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]