Pregunta

¿Hay alguna manera de vincular un MemoryStream al control asp:image?

¿Fue útil?

Solución

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

Otros consejos

Lo mejor es crear un HttpHandler que devuelva la imagen.Luego vincule la propiedad ImageUrl en asp:Image a la URL de HttpHandler.

Aquí hay un código.

Primero cree 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 llámelo dentro de su página aspx donde está usando asp:Image.

<%@ 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.

Supongo que necesitas generar imágenes dinámicas de Asp.net, podrías estar de suertehttp://www.codeplex.com/aspnet/Release/ProjectReleases.aspx?ReleaseId=16449

Hanselman escribió en su blog sobre esto recientemente.http://www.hanselman.com/blog/ASPNETFuturesGeneratingDynamicImagesWithHttpHandlersGetsEasier.aspx

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

Es más liviano que una página ASP.Net completa y está diseñado específicamente para manejar tipos de contenido distintos de texto/html.

Si bien no es posible vincular un flujo de memoria a una imagen, podría ser posible utilizar una etiqueta/control genérico, algo de código y el esquema de URI de datos para incrustar imágenes en páginas, pero existen graves problemas con ese enfoque:

Desventajas

  • El contenido incrustado debe extraerse y decodificarse antes de poder realizar cambios, y luego volver a codificarse e incrustarse.
  • No se admiten cookies.
  • La información que se incrusta más de una vez se vuelve a descargar como parte del archivo que la contiene y, por lo tanto, no se beneficia de la memoria caché del navegador.
  • Los navegadores pueden limitar la longitud de los 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[cita requerida]
  • 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.
  • Internet Explorer de Microsoft, hasta la versión 7 (alrededor del 70% del mercado en el segundo trimestre de 2008), carece de soporte.

El mejor enfoque es utilizar una página "Image.aspx" separada que toma y genera su MemoryStream, algo así como lo hice en mi software de álbum de fotos que creé cuando comencé a aprender ASP.net:

(No te rías, ese fue mi primer intento en ASP.net :-)

Editar:De acuerdo con ASHX, el código anterior es solo para mostrar una implementación de muestra.Cuando venga a actualizar el Álbum de fotos, usará ASHX para eso.

Puede utilizar el control BinaryImage de Telerik para ASP.net.

Más información aquí:http://www.telerik.com/products/aspnet-ajax/binaryimage.aspx

No.

Pero puedes crear una página especial para transmitir esa imagen.Primero, configura la URL de la imagen en la página que realiza la transmisión, incluidos algunos parámetros de URL que le permiten saber dónde obtener la imagen:

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

en GetImage.aspx, obtienes el nombre del archivo (o lo que sea) de la URL, cargas la imagen en tu MemoryStream y luego escribes el contenido de ese flujo de memoria directamente en HttpResponse:

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

Para mí fue necesario agregar "buffer="false" al archivo @Page.De lo contrario, seguiría recibiendo la misma imagen todo el tiempo...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top