画像を表すバイト配列があります。そのバイト配列に格納されている画像をaspxページに表示したいと思います。画像またはイメージマップコントロールを使用して実行できますか?もしそうなら-どのように?そうでない場合-解決策は何ですか?
通常の画像がWebページでどのように提供されるかを考えてみてください。ファイル名はマークアップで参照され、ブラウザはそのファイルの個別のリクエストをサーバーに送信します。
静的画像ファイルを参照する代わりに、画像のバイトを提供するASP.NETハンドラーを参照することを除いて、同じ原理がここに適用されます。
<img src="/imagehandler.ashx" />
ハンドラーのショートは次のようになります。
public class ImageHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.OutputStream.Write(imageData, 0, imageData.Length);
context.Response.ContentType = "image/JPEG";
}
}
ASP.NETでHttpHanderを作成する(長い) 概念をカバーするリソース を次に示します。
また、Joelが指摘しているように、HttpHandlerはページとはまったく異なるリクエストで処理されるため、バイト配列がどこから来ているかを考えてください。最も基本的なレベルでは、2つの要求はお互いを認識していないか、データを共有していません。
この問題の一般的な解決策は、画像データをキャッシュに入れることです。
Guid id = Guid.NewGuid();
HttpRuntime.Cache.Add(id.ToString(), imageData);
そして、キーをクエリ文字列のHttpHandlerに渡して、キャッシュからフェッチできるようにします。
<img src="/imagehandler.ashx?img=<%=id%>" />
<!-- will print ...ashx?img=42a96c06-c5dd-488c-906f-cf20663d0a43 -->
速くできるもう1つのことは、asp.net Imageコントロールを使用せず、htmlで基本的なimg要素を使用することです。したがって、asp.netページ内で、imgのidとrunatをサーバーに設定したimg要素を作成します。
それからあなたはこのようなことをすることができます:
<img id="img" runat="server" alt=""/>
public DataRow ClaimPhotoRow { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
img.Src = "data:image/jpg;base64," + Convert.ToBase64String((byte[])ClaimPhotoRow[0]);
}
あなたは写真を提供する一般的なハンドラーを書くことができます:
<%@ WebHandler Language="C#" Class="Picture" %>
public class Picture : System.Web.IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
byte[] buffer = GetPictureFromSomewhere();
context.Response.ContentType = "image/jpeg";
context.Response.OutputStream.Write(buffer, 0, buffer.Length);
}
public bool IsReusable
{
get { return false; }
}
}
そして、それをaspxページで呼び出します:
<asp:Image ID="pic" runat="server" ImageUrl="~/Picture.ashx" />
次の記事はあなたの質問に答えます: byte []をasp:Imageに自動バインドする