Domanda

Esiste un modo per associare un MemoryStream al controllo asp:image?

È stato utile?

Soluzione

Un gestore può accettare un parametro URL come qualsiasi altra richiesta.Quindi, invece di collegare il tuo file <asp:image/> A image.ashx lo imposteresti su image.ashx?ImageID=[Your image ID here].

Altri suggerimenti

La soluzione migliore è creare un HttpHandler che restituisca l'immagine.Associa quindi la proprietà ImageUrl in asp:Image all'URL di HttpHandler.

Ecco del codice.

Per prima cosa crea 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);
   }
}

Successivamente, chiamalo semplicemente all'interno della tua pagina aspx in cui stai utilizzando 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>

E questo è tutto.

Suppongo che tu debba generare immagini dinamiche da asp.net che potresti essere fortunatohttp://www.codeplex.com/aspnet/Release/ProjectReleases.aspx?ReleaseId=16449

Hanselman ne ha scritto recentemente sul bloghttp://www.hanselman.com/blog/ASPNETFuturesGeneratingDynamicImagesWithHttpHandlersGetsEasier.aspx

@Will e Ben Griswald:invece di "image.aspx" utilizzare "image.ashx".

È più leggero di una pagina ASP.Net completa ed è progettato specificamente per gestire tipi di contenuto diversi da testo/html.

Anche se non è possibile associare un MemoryStream a un'immagine, potrebbe essere possibile utilizzare un Label/GenericControl, del codice e il schema URI dei dati per incorporare immagini in Pages, ma ci sono gravi problemi con questo approccio:

Svantaggi

  • Il contenuto incorporato deve essere estratto e decodificato prima che possano essere apportate modifiche, quindi ricodificato e reintegrato successivamente.
  • I cookie non sono supportati.
  • Le informazioni incorporate più di una volta vengono scaricate nuovamente come parte del file che le contiene e quindi non beneficiano della cache del browser.
  • I browser possono limitare la lunghezza degli URI, creando una dimensione massima effettiva dei dati.Ad esempio, gli URI nelle versioni precedenti di Opera avevano limiti di 4kB e 32kB per IE8 Beta 1[citazione necessaria]
  • I dati vengono inclusi come flusso semplice e molti ambienti di elaborazione (come i browser Web) potrebbero non supportare l'uso di contenitori (come multipart/alternative o message/rfc822) per fornire una maggiore complessità come metadati, compressione dei dati o negoziazione del contenuto.
  • Internet Explorer di Microsoft, fino alla versione 7 (circa il 70% del mercato nel secondo trimestre del 2008), non dispone di supporto.

L'approccio migliore è utilizzare una pagina "Image.aspx" separata che acquisisce e genera MemoryStream, un po' come ho fatto nel software Photo Album che ho creato quando ho iniziato a imparare ASP.net:

(Non ridere, quello è stato il mio primo tentativo su ASP.net :-)

Modificare:Concordato su ASHX, il codice sopra serve solo per mostrare un'implementazione di esempio.Quando arrivo ad aggiornare l'album fotografico, utilizzerà ASHX per questo.

Puoi utilizzare il controllo BinaryImage di Telerik per ASP.net.

Maggiori informazioni qui:http://www.telerik.com/products/aspnet-ajax/binaryimage.aspx

No.

Ma puoi creare una pagina speciale per trasmettere in streaming quell'immagine.Innanzitutto, imposti l'URL dell'immagine sulla pagina che esegue lo streaming, inclusi alcuni parametri URL che ti consentono di sapere dove trovare l'immagine:

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

in GetImage.aspx, ottieni il nome file (o qualsiasi altra cosa) dall'URL, carichi l'immagine in MemoryStream e quindi scrivi il contenuto di quel flusso di memoria direttamente su HttpResponse:

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

Per me è stato necessario aggiungere "buffer="false" alla @Page.Altrimenti continuerei ad avere sempre la stessa immagine...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top