bytearray a la imagen asp.net

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?

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.

Aquí se aplica el mismo principio, excepto que en lugar de hacer referencia a un archivo de imagen estática, querrá hacer referencia a un controlador de ASP.NET que sirve los bytes de la imagen:

 

El corto del controlador se vería así:

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

Aquí hay un recurso (largo) que cubre los conceptos 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 imagen en caché:

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

Y pase la clave al HttpHandler en la cadena de consulta, para que pueda recuperarla de la memoria caché:

   

Otra cosa que puede hacer que es más rápida sería no usar el control de imagen asp.net y usar el 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 podrías hacer algo como esto:

 public DataRow ClaimPhotoRow { get; set; } protected void Page_Load(object sender, EventArgs e) { img.Src = "data:image/jpg;base64," + Convert.ToBase64String((byte[])ClaimPhotoRow[0]); } 

Podría escribir un controlador genérico que sirva 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 llámalo en una página aspx:

  

El siguiente artículo responde a su pregunta: Byte de enlace automático [] a asp: Imagen