出力ストリームに画像を出力するとき、一時的な保存が必要ですか?画像をファイルに保存するときに、通常はフォルダ許可エラーに関連付けられている「generic GDI +」エラーが表示されます。
画像に対して行っていることは、テキストを追加することだけです。変更せずに画像をそのまま出力しても、エラーが発生します。たとえば、これを行うとエラーが発生します:
using (Bitmap image = new Bitmap(context.Server.MapPath("images/stars_5.png")))
{
image.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Png);
}
IIS 7.5およびASP.NET 2.0でWindows 7を実行しているローカルマシンですべてが正常に動作します。WindowsServer 2003を実行しているQAサーバーでIIS 6およびASP.NET 2.0。
エラーが発生している行は次のとおりです。
image.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Png);
スタックトレースは次のとおりです。
[ExternalException (0x80004005): A generic error occurred in GDI+.]
System.Drawing.Image.Save(Stream stream, ImageCodecInfo encoder, EncoderParameters encoderParams) +378002
System.Drawing.Image.Save(Stream stream, ImageFormat format) +36
GetRating.ProcessRequest(HttpContext context) in d:\inetpub\wwwroot\SymInfoQA\Apps\tools\Rating\GetRating.ashx:54
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +181
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75
PNG(およびその他の形式)は、シーク可能なストリームに保存する必要があります。中間のMemoryStream
を使用すると、トリックが実行されます。
using (Bitmap image = new Bitmap(context.Server.MapPath("images/stars_5.png")))
{
using(MemoryStream ms = new MemoryStream())
{
image.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
ms.WriteTo(context.Response.OutputStream);
}
}
追加するだけです:
Response.ContentType = "image/png";
そのため、img
タグ内にない場合は、ブラウザーで直接表示できます。