さまざまな種類の画像をデータベースに保存し、.ashx を使用して画像を取得し、サイトに表示するために応答出力ストリームに書き込みます。
これは、ビットマップを除くすべての画像タイプでうまく機能します。保存および表示しようとするビットマップに対して得られるのは、ビットマップのサイズのブラックボックスだけです。
ビットマップを取得してディスクに保存すると、うまく機能するため、ビットマップが DB に正しく保存されていることはわかっています。
問題のコードは次のとおりです。
Image image = GetImage(out type);
context.Response.ContentType = type;
// Save the image to the OutputStream
ImageFormat i_format = null;
switch (type.ToLower())
{
case "image/jpg":
case "image/jpeg":
{
i_format = ImageFormat.Jpeg;
}
break;
case "image/png":
{
i_format = ImageFormat.Png;
}
break;
case "image/bmp":
{
i_format = ImageFormat.Bmp;
}
break;
case "image/gif":
{
i_format = ImageFormat.Gif;
}
break;
}
//this results in a black box if it's a bitmap.
//all other image types work fine
image.Save(context.Response.OutputStream, i_format);
//if I save the bitmap image to a file, it's fine - no black box
image.Save("c:\\temp\\test.bmp", i_format);
私が間違っていることは明らかだと考えなければなりませんが、何が起こっているのかを理解できればいいのです。
編集:
私はそれをもう少し追跡しました。ブラウザに表示されている黒い画像を右クリックして [名前を付けて保存...] を実行すると、結果のファイルが切り捨てられます。たとえば、元のイメージが 126 バイトの場合、保存されたイメージは 122 バイトです。
問題は画像そのものではありません。上で述べたように、image.Save to a file は正常に動作します。
だから今、画像をresponse.OutputStreamに保存しているときに何かが起こっていると思っています。content-length を正しいサイズに設定しようとしましたが、役に立ちませんでした。
まだ解決策はありませんが、もう少し進んでいます...