2009-11-15 26 views
21

Ich habe ein Byte-Array, das ein Bild darstellt. Ich möchte das Bild in diesem Byte-Array in einer aspx-Seite präsentieren. Kann ich das mit einem Bild- oder Imagemap-Steuerelement tun? Wenn das so ist, wie? Wenn nicht - was ist die Lösung?Bytearray zu Bild asp.net

Antwort

20

Denken Sie darüber nach, wie normale Bilder in einer Webseite bereitgestellt werden - der Dateiname wird in Markup referenziert, und der Browser sendet eine separate Anfrage an den Server für diese Datei.

Das gleiche Prinzip gilt auch hier, mit Ausnahme stattdessen eine statische Bilddatei zu referenzieren, würden Sie wollen, eine ASP.NET-Handler verweisen, die die Bytes des Bildes dient:

<img src="/imagehandler.ashx" /> 

Die kurze des Handlers würde etwa wie folgt aussehen:

public class ImageHandler : IHttpHandler 
{ 
    public void ProcessRequest(HttpContext context) 
    { 
     context.Response.OutputStream.Write(imageData, 0, imageData.Length); 
     context.Response.ContentType = "image/JPEG"; 
    } 
} 

Hier ist eine (lange) resource that covers the concepts von einer HttpHander in ASP.NET zu schaffen.

Auch, wie Joel darauf hinweist, denken Sie darüber nach, woher das Byte-Array kommt, da der HttpHandler in einer ganz anderen Anfrage als die Seite bedient wird. Auf der grundlegendsten Ebene sind sich die beiden Anfragen nicht bewusst oder teilen keine Daten.

Eine gemeinsame Lösung für dieses Problem ist es, die Bilddaten im Cache zu setzen:

Guid id = Guid.NewGuid(); 
HttpRuntime.Cache.Add(id.ToString(), imageData); 

Und den Schlüssel für die Httphandler in der Abfragezeichenfolgeflag passieren, so kann es aus dem Cache geholt werden:

<img src="/imagehandler.ashx?img=<%=id%>" /> 
<!-- will print ...ashx?img=42a96c06-c5dd-488c-906f-cf20663d0a43 --> 
+3

+1 - auch beachten, bedeutet dies, dass Sie wahrscheinlich zu überdenken, wie Ihre aktuelle Seite Arbeiten benötigen, da Sie die Wahrscheinlichkeit erhalten Byte-Array im Verlauf der Verarbeitung einer Anfrage für eine andere Ressource. –

+0

Guter Punkt Joel. –

4

Sie können einen generischen Handler schreiben, die das Bild dienen:

<%@ 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; } 
    } 
} 

Und dann rufen mich t in einer aspx Seite:

<asp:Image ID="pic" runat="server" ImageUrl="~/Picture.ashx" /> 
35

Eine andere Sache, die Sie tun können, die nicht die asp.net Bildsteuerung zu verwenden wäre schneller ist und verwenden Sie das grundlegende Element img in html. Erstellen Sie also in Ihrer asp.net-Seite ein img-Element mit einer ID von img und einem runat, der auf den Server gesetzt ist.

Dann könnten Sie so etwas tun:

<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]); 

} 
+1

Danke für netten Trick :) –

+1

Clevere Lösung. Beachten Sie, dass IEs vor Version 8 das Daten-URL-Schema nicht verwenden können http://caniuse.com/datauri –

+1

Vielen Dank für die Lösung meines Problems mit den wenigsten Schritten. – Ahmad