web-dev-qa-db-ja.com

C#-GDI +エラーを与える応答出力ストリームに画像を出力する

出力ストリームに画像を出力するとき、一時的な保存が必要ですか?画像をファイルに保存するときに、通常はフォルダ許可エラーに関連付けられている「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
41
Daniel

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);
   }
}
90
Mark Cidade

追加するだけです:

Response.ContentType = "image/png";

そのため、imgタグ内にない場合は、ブラウザーで直接表示できます。

10
oamilkar