Question

Est-il un moyen de lier un MemoryStream à l'asp:contrôle de l'image?

Était-ce utile?

La solution

Un gestionnaire peut accepter un paramètre de l'url, comme de toute autre demande.Ainsi, au lieu de lier votre <asp:image/> pour image.ashx vous devez mettre la valeur image.ashx?ImageID=[Your image ID here].

Autres conseils

Meilleur pari est de créer un HttpHandler qui retourne l'image.Puis de lier la propriété ImageUrl sur l'asp:Image à l'url de la HttpHandler.

Voici une partie du code.

D'abord créer le 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);
   }
}

Ensuite, il suffit de l'appeler à l'intérieur de votre page aspx où vous êtes à l'aide de l'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>

Et c'est tout.

Je suis en supposant que vous avez besoin pour générer des images dynamiques de asp.net Vous pouvez être de la chance http://www.codeplex.com/aspnet/Release/ProjectReleases.aspx?ReleaseId=16449

, Hanselman blogué à ce sujet récemment http://www.hanselman.com/blog/ASPNETFuturesGeneratingDynamicImagesWithHttpHandlersGetsEasier.aspx

@Will et Ben Griswald:au lieu de "l'image.aspx '" utilisation "de l'image.ashx".

Il est plus léger qu'un ASP.Net Page, et il est spécifiquement conçu pour gérer les types de contenu autre que texte/html.

Alors que la liaison de données un MemoryStream d'une Image n'est pas possible, il pourrait être possible d'utiliser une Étiquette/GenericControl, un peu de Code et la les données de schéma d'URI pour intégrer des Images dans les Pages, mais il y a de graves problèmes avec cette approche:

Inconvénients

  • Contenu incorporé doit être extraite et décodé avant que des modifications peuvent être apportées, puis re-codé et ré-intégré par la suite.
  • Les Cookies ne sont pas pris en charge.
  • Informations incorporées plus d'une fois est retéléchargé dans le cadre de l'contenant le fichier, et donc ne bénéficient pas de la mémoire cache du navigateur.
  • Les navigateurs peuvent limiter URI longueurs, la création d'un effectif maximum de la taille des données.Par exemple, les Uri dans les précédentes versions d'Opera avait des limites de 4 ko et 32 ko pour IE8 Beta 1[citation nécessaire]
  • Les données sont inclus à titre de simple ruisseau, et de nombreux environnements de traitement (tels que les navigateurs web) ne peut pas soutenir à l'aide de conteneurs (comme multipart/alternative ou un message/rfc822) afin de fournir une plus grande complexité, tels que les métadonnées, la compression de données, ou la négociation de contenu.
  • Microsoft Internet Explorer jusqu'à la version 7 (environ 70% du marché en 2008 T2), manque de soutien.

La meilleure Approche est d'utiliser une Image.aspx" à la Page qui les prend et les sorties de votre MemoryStream, un peu comme j'ai fait dans mon Album Photo logiciel que j'ai créé quand j'ai commencé à apprendre ASP.net:

(Ne riez pas, c'était ma première tentative ASP.net :-)

Edit:D'accord sur ASHX, le code ci-dessus est juste pour montrer un exemple de mise en œuvre.Quand je viens autour de la mise à jour de l'Album Photo, il va utiliser ASHX pour que.

Vous pouvez utiliser Telerik est BinaryImage de contrôle pour ASP.net.

Plus d'infos ici:http://www.telerik.com/products/aspnet-ajax/binaryimage.aspx

Nope.

Mais vous pouvez créer une page spéciale pour diffuser cette image.Tout d'abord, vous définissez l'URL de l'image à la page qui effectue la diffusion en continu, y compris certains des paramètres d'url qui vous permettent de savoir où obtenir de l'image:

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

dans GetImage.aspx, vous obtenez le nom de fichier (ou autre) à partir de l'URL, charger l'image dans votre MemoryStream, et puis écrire le contenu de cette mémoire stream directement à 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();

Pour moi, il était nécessaire d'ajouter un "buffer="false" à la Page@.Sinon, je reçois la même image tout le temps...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top