文字列型と System.Drawing.Image のディクショナリを返すコントロールがあります。ディクショナリをループして、各キーと値のペアに含まれるイメージを表示する ASP イメージ コントロールを出力したいと考えています。これは HTTP ハンドラーを介して行う必要があることは理解していますが、その方法がよくわかりません。画像をバイト配列に変換し、ハンドラーからの出力ストリームとして返す必要があると仮定すると、画像またはバイト配列をハンドラーのコンテキストの一部として渡すにはどうすればよいでしょうか?
4 に答える
Content Type と Stream を正しく返す必要があります。この リンクを参照してください。
Web で利用可能なほとんどの例では、id が ashx ハンドラーに渡されます。ID とともにハンドラー パスがイメージ コントロールへのソースとして設定されます。ほとんどの場合、ハンドラーへの各リクエストは、DB にアクセスして画像をフェッチし、処理を行い、画像をレンダリングします。
ただし、あなたの場合、既に画像の辞書を持っているようです (したがって、その情報をハンドラーに渡す方法が必要になります)。これにアプローチできる 1 つの方法は、イメージをメモリ ストリームとしてキャッシュし、ashx ハンドラーでキャッシュされたアイテムにアクセスして、後でキャッシュをクリアすることです。これはすでにここで議論されています。しかし、エレガントなソリューションではありません。
Scott Hanselman によるこのブログ投稿もチェックしてください。<asp:image/>
ここでは、ディクショナリ オブジェクトをリピーターにバインドしていて、HttpHandler の名前が imageHandler であると想定しています。したがって、辞書オブジェクトがバインドされると、次のようなものが得られます
<ItemTemplate> <asp:Image id="image1" runat="server" ImageUrl='<%# "~/imageHandler.ashx?k=" + Eval("key")%>' />
</ItemTemplate>
httphandler で、キーを提供するクエリ文字列を読み取ります。その後、辞書から system.drawing.image を取得し、その後、それを bytearray に変換してさらに続行できます。
コードをさらにリファクタリングして、すべてのキー値をリストまたは列挙型として取得してバインドし、httphandler でデータベースにクエリを実行できます。
Response.Write(byte array) and response.contenttype= "give the correct content type"
お役に立てれば。
Image.Saveメソッドを呼び出すことができます。
using(MemoryStream ms = new MemoryStream())
{
image.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
ms.WriteTo(context.Response.OutputStream);
}