Comment lier un MemoryStream à l'asp:contrôle de l'image?
-
09-06-2019 - |
Question
Est-il un moyen de lier un MemoryStream à l'asp:contrôle de l'image?
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...