web-dev-qa-db-ja.com

asp.netを画像化するバイト配列

画像を表すバイト配列があります。そのバイト配列に格納されている画像をaspxページに表示したいと思います。画像またはイメージマップコントロールを使用して実行できますか?もしそうなら-どのように?そうでない場合-解決策は何ですか?

22
user181218

通常の画像が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 -->
21
Rex M

速くできるもう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]);

}
35
Jay Stratemeyer

あなたは写真を提供する一般的なハンドラーを書くことができます:

<%@ 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" />
4
Darin Dimitrov

次の記事はあなたの質問に答えます: byte []をasp:Imageに自動バインドする

2
vitaly-t