2008-09-05 6 views
13

Existe-t-il un moyen de lier un MemoryStream au contrôle asp: image?Comment lier un MemoryStream à asp: le contrôle d'image?

+0

. Le http: //imageresizing.net HttpModule le rend très facile –

+0

Merci à tout le monde pour vos réponses.J'ai aussi utilisé le httphandler pour ce problème, mais j'ai besoin d'un peu plus que cela.Je veux passer un paramètre à httphandler qui génère différentes images à une grille et la différence sera fournie par l'ID de la rangée, donc je dois passer un paramètre à ce httphandler. est-ce que cela est pratique? avoir une suggestion? –

Répondre

7

un gestionnaire peut accepter un paramètre d'URL comme toute autre demande. Ainsi, au lieu de lier votre <asp:image/> à image.ashx, vous le définissez sur image.ashx?ImageID=[Your image ID here].

+0

Et la bibliothèque http://imageresizing.net fait cela pour vous. –

40

Le meilleur pari est de créer un HttpHandler qui retournerait l'image. Puis liez la propriété ImageUrl sur l'asp: Image à l'URL du HttpHandler.

Voici 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 d'appeler à l'intérieur de votre page ASPX où vous utilisez le 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.

+0

Y at-il un moyen de le faire sans HttpHandler, je n'ai pas écrire pour créer un gestionnaire dans mon projet ' –

1

Alors que Databinding un MemoryStream à une image est impossible , il peut être possible d'utiliser un Label/GenericControl, du Code et le data URI scheme pour incorporer des Images dans Pages, mais il y a de sérieux problèmes avec cette approche:

Inconvénients

  • contenu incorporé doit être extrait et décodé avant que les modifications peuvent être apportées, puis re-codé et re-intégré par la suite.
  • Les cookies ne sont pas supportés.
  • Les informations intégrées plusieurs fois sont téléchargées dans le fichier conteneur et ne bénéficient donc pas du cache du navigateur.
  • Les navigateurs peuvent limiter les longueurs d'URI, créant ainsi une taille de données maximale effective. Par exemple, les URI des versions antérieures d'Opera avaient des limites de 4 Ko et 32 ​​Ko pour IE8 Beta 1 [citation requise]
  • Les données sont incluses dans un flux simple et de nombreux environnements de traitement (tels que les navigateurs Web) ne prennent pas en charge les conteneurs (comme multipart/alternative ou message/rfc822) pour fournir une plus grande complexité telle que les métadonnées, la compression de données ou la négociation de contenu.
  • Microsoft Internet Explorer, à travers la version 7 (environ 70% du marché à partir de 2008 Q2), manque de soutien.

La meilleure approche consiste à utiliser une page « Image.aspx » séparée TENANT et sorties votre MemoryStream, un peu comme je l'ai fait dans mon logiciel Album photo que j'ai créé quand je commencé à apprendre ASP.net :

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

Edit: d'accord sur ASHX, le code ci-dessus est juste pour montrer un exemple d'implémentation. Quand je viendrai mettre à jour l'album photo, il utilisera ASHX pour cela.

2

@Will et Ben Griswald: au lieu de "image.aspx", utilisez "image.ashx".

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

0

Non.

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

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

à GetImage.aspx, vous obtenez le nom de fichier (ou quoi que) à partir de l'URL, charger l'image dans votre MemoryStream, puis écrire le contenu de ce flux de mémoire directement au 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

Pour moi, il était nécessaire d'ajouter « tampon = » false » au @Page Sinon, je garderais obtenir la même image tout le temps ...

Questions connexes