2008-09-05 18 views
13

¿Hay alguna manera de vincular un MemoryStream a asp: control de imagen?Cómo vincular un MemoryStream a asp: ¿control de imagen?

+0

. El http://imageresizing.net HttpModule hace que sea muy fácil. –

+0

gracias a todos por sus respuestas. También usé el httphandler para este problema, pero necesito un poco más que eso. Quiero pasar un parámetro a httphandler que genere diferentes imágenes a una Grilla y la diferencia será provista por id de la fila, así que tengo que pasar un parámetro a este httphandler. ¿Es conveniente? ¿Tiene una sugerencia? –

Respuesta

7

un controlador puede aceptar un parámetro de URL como cualquier otra petición. Entonces, en lugar de vincular su <asp:image/> al image.ashx, lo establecería en image.ashx?ImageID=[Your image ID here].

+0

Y la biblioteca http://imageresizing.net hace eso por usted. –

40

La mejor opción es crear un HttpHandler que devuelva la imagen. A continuación, vincula la propiedad ImageUrl en el asp: Image a la url del HttpHandler.

Aquí hay algunos códigos.

En primer lugar crear el HttpHandler:

<%@ WebHandler Language="C#" Class="ImageHandler" %> 

using System.Drawing; 
using System.Drawing.Imaging; 
using System.IO; 
using System.Web; 

public class ImageHandler : IHttpHandler 
{  
    public void ProcessRequest (HttpContext context) 
    { 
     context.Response.Clear(); 

     if (!String.IsNullOrEmpty(context.Request.QueryString["id"])) 
     { 
      int id = Int32.Parse(context.Request.QueryString["id"]); 

      // Now you have the id, do what you want with it, to get the right image 
      // More than likely, just pass it to the method, that builds the image 
      Image image = GetImage(id); 

      // Of course set this to whatever your format is of the image 
      context.Response.ContentType = "image/jpeg"; 
      // Save the image to the OutputStream 
      image.Save(context.Response.OutputStream, ImageFormat.Jpeg); 
     } 
     else 
     { 
      context.Response.ContentType = "text/html"; 
      context.Response.Write("<p>Need a valid id</p>"); 
     } 
    } 

    public bool IsReusable 
    { 
     get 
     { 
      return false; 
     } 
    } 

    private Image GetImage(int id) 
    { 
     // Not sure how you are building your MemoryStream 
     // Once you have it, you just use the Image class to 
     // create the image from the stream. 
     MemoryStream stream = new MemoryStream(); 
     return Image.FromStream(stream); 
    } 
} 

A continuación, simplemente llame dentro de su página aspx donde se está utilizando el asp: Imagen.

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
     <div> 
      <asp:Image ID="myImage" ImageUrl="~/ImageHandler.ashx?id=1" runat="server" /> 
     </div> 
    </form> 
</body> 
</html> 

Y eso es todo.

+0

¿Hay alguna manera de hacer esto sin HttpHandler, no tengo escribir para crear controlador en mi proyecto ' –

1

Mientras DataBinding un MemoryStream a una imagen que no es posible , podría ser posible utilizar Label/GenericControl, algún código y data URI scheme para incrustar imágenes en páginas, pero existen problemas graves con ese enfoque:

Desventajas

  • contenido interno debe ser extraído y decodificado antes se pueden hacer cambios, entonces vuelven a codificar y re-incrustado después.
  • Las cookies no son compatibles.
  • La información que está incorporada más de una vez se vuelve a descargar como parte del archivo contenedor y, por lo tanto, no se beneficia de la memoria caché del navegador.
  • Los navegadores pueden limitar la longitud de URI, creando un tamaño de datos máximo efectivo. Por ejemplo, los URI en versiones anteriores de Opera tenían límites de 4kB y 32kB para IE8 Beta 1 [citación necesitada]
  • Los datos se incluyen como una secuencia simple y es posible que muchos entornos de procesamiento (como los navegadores web) no admitan el uso de contenedores (como multipart/alternative o message/rfc822) para proporcionar una mayor complejidad, como metadatos, compresión de datos o negociación de contenido.
  • Microsoft Internet Explorer, hasta la versión 7 (aproximadamente el 70% del mercado a partir del 2008 Q2), carece de soporte.

El mejor enfoque es utilizar una página separada "Image.aspx", que tiene salidas y su MemoryStream, un poco como lo hice en mi software de álbum de fotos que he creado cuando empecé a aprender ASP.net :

(Don't laugh, that was my first attempt at ASP.net :-)

Editar: Acordado el ASHX, el código anterior es sólo para mostrar un ejemplo de implementación. Cuando regrese para actualizar el álbum de fotos, usará ASHX para eso.

2

@Will y Ben Griswald: en lugar de "image.aspx" usa "image.ashx".

Es más liviano que un ASP completo.Net Page, y está específicamente diseñado para manejar tipos de contenido que no sean text/html.

0

No.

Pero puede crear una página especial para transmitir esa imagen. En primer lugar, se establece la dirección URL de la imagen para la página que realiza la transmisión, incluyendo algunos parámetros de URL que le permiten saber dónde obtener la imagen:

<img src="GetImage.aspx?filename=foo" ... /> 

en GetImage.aspx, se obtiene el nombre del archivo (o lo que sea) a partir de la URL, cargar la imagen en su MemoryStream, y luego escribir el contenido de esa secuencia de memoria directamente a la HttpResponse:

response.Expires = 0; 
    response.Buffer = false; 
    response.Clear(); 
    response.ClearHeaders(); 
    response.ClearContent(); 
    response.ContentType = "image/jpeg"; 
    response.BinaryWrite(stream); 
    response.Flush(); 
    response.Close(); 
0

Para mí fue necesario añadir "buffer =" false" a la @Page De lo contrario me gustaría seguir recibiendo la misma imagen todo el tiempo ...

Cuestiones relacionadas