2009-11-15 30 views
21

Tengo una matriz de bytes que representa una imagen. Quiero presentar la imagen almacenada en ese conjunto de bytes en una página aspx. ¿Puedo hacerlo usando un control de imagen o mapa de imágenes? ¿Si es así, cómo? Si no, ¿cuál es la solución?bytearray a imagen asp.net

Respuesta

20

Piense en cómo se sirven las imágenes normales en una página web: el nombre del archivo se referencia en el marcado, y el navegador envía una solicitud por separado al servidor para ese archivo.

El mismo principio se aplica aquí, pero en lugar de hacer referencia a un archivo de imagen estática, que se quiere hacer referencia a un controlador de ASP.NET que sirve los bytes de la imagen:

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

El corto del manipulador haría algo parecido a esto:

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

Aquí es un (largo) resource that covers the concepts de crear un HttpHander en ASP.NET.

Además, como señala Joel, piense de dónde viene la matriz de bytes, ya que HttpHandler se sirve en una solicitud totalmente diferente a la de la página. En el nivel más básico, las dos solicitudes no se conocen entre sí ni comparten ningún dato.

Una solución común a este problema es poner los datos de la imagen en la memoria caché:

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

y pasar la llave de la HttpHandler en la cadena de consulta, por lo que puede recuperar desde la memoria caché:

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

+1 - también en cuenta esto significa que es probable que tenga que volver a pensar en cómo funciona su página actual, ya que es probable que obtuvo el matriz de bytes durante el procesamiento de una solicitud de un recurso diferente. –

+0

Buen punto Joel. –

4

se puede escribir un controlador genérico que servirá la imagen:

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

y luego llamar i t en una página aspx:

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

Otra cosa que puede hacer que sea más rápida sería la de no utilizar el control asp.net y utilizando un elemento básico img en html. Por lo tanto, dentro de su página asp.net, cree un elemento img con un id de img y runat establecido en el servidor.

entonces se podría hacer algo como esto:

<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

Gracias por buen truco :) –

+1

Solución inteligente. Tenga en cuenta que los IE anteriores a la versión 8 no pueden usar el esquema de URL de datos http://caniuse.com/datauri –

+1

Muchas gracias por resolver mi problema con el menor número de pasos. – Ahmad

Cuestiones relacionadas