2009-11-15 19 views
21

Ho una matrice di byte che rappresenta un'immagine. Voglio presentare l'immagine memorizzata in quell'array di byte in una pagina aspx. Posso farlo usando un'immagine o un controllo della mappa? Se é cosi, come? In caso contrario, qual è la soluzione?bytearray all'immagine asp.net

risposta

20

Pensa a come le immagini normali vengono pubblicate in una pagina Web: il nome file viene fatto riferimento nel markup e il browser invia una richiesta separata al server per quel file.

Lo stesso principio si applica qui, tranne che invece di fare riferimento a un file di immagine statica, si vorrebbe fare riferimento a un gestore di ASP.NET che serve i byte dell'immagine:

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

La breve del gestore sarebbe simile a questa:

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

Ecco una (lunga) resource that covers the concepts di creare un HttpHander in ASP.NET.

Inoltre, come fa notare Joel, pensa a da dove viene la matrice di byte, poiché HttpHandler è servito in una richiesta completamente diversa dalla pagina. Al livello più elementare, le due richieste non sono a conoscenza l'una dell'altra o non condividono alcun dato.

Una soluzione comune a questo problema è quello di mettere i dati di immagine nella cache:

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

E passare la chiave del HttpHandler nella querystring, in modo che possa prenderlo dalla cache:

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

+1 - anche notare che questo significa che sarà probabilmente bisogno di ripensare come funziona la vostra pagina corrente, dal momento che probabilmente ottenuto il array di byte nel corso dell'elaborazione di una richiesta per una risorsa diversa. –

+0

Buon punto Joel. –

4

Si potrebbe scrivere un gestore generica che servirà l'immagine:

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

E quindi chiamare i t in una pagina aspx:

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

Un'altra cosa che si può fare, che è più veloce sarebbe non utilizzare il controllo asp.net immagine e utilizzare l'elemento di base img in html. Quindi, nella tua pagina asp.net, crea un elemento img con un id di img e runat impostato sul server.

allora si potrebbe fare qualcosa di simile:

<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

Grazie per il bel trucco :) –

+1

Soluzione intelligente. Tieni presente che gli IE precedenti alla versione 8 non possono utilizzare lo schema URL dei dati http://caniuse.com/datauri –

+1

Grazie mille per aver risolto il mio problema con il minor numero di passaggi. – Ahmad