Wie bindet man einen MemoryStream an asp: image control?

Gibt es eine Möglichkeit, einen MemoryStream an asp: image control zu binden?

Ein Handler kann einen URL-Parameter wie jede andere Anfrage akzeptieren. Anstatt also Ihr mit image.ashx zu image.ashx , würden Sie es auf image.ashx?ImageID=[Your image ID here] .

Am besten erstellen Sie einen HttpHandler, der das Bild zurückgibt. Dann binden Sie die ImageUrl-Eigenschaft auf dem Asp: Image an die URL des HttpHandler.

Hier ist ein Code.

Erstellen Sie zuerst den 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("

Need a valid id

"); } } 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); } }

Als nächstes rufen Sie es einfach in Ihrer aspx-Seite auf, wo Sie das asp: Image verwenden.

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

Und das ist alles.

Ich nehme an, dass Sie dynamische Bilder von asp.net generieren müssen Sie möglicherweise Glück http://www.codeplex.com/aspnet/Release/ProjectReleases.aspx?ReleaseId=16449

Hanselman hat kürzlich darüber gebloggt http://www.hanselman.com/blog/ASPNETFuturesGeneratingDynamicImagesWithHttpHandlersGetsEasier.aspx

@Will und Ben Griswald: statt “image.aspx” verwende “image.ashx”.

Es ist leichter als eine vollständige ASP.Net-Seite, und es wurde speziell entwickelt, um andere Inhaltstypen als text / html zu behandeln.

Während die Datenbindung eines MemoryStreams an ein Image nicht möglich ist, könnte es möglich sein, ein Label / GenericControl, einen Code und das Daten-URI-Schema zum Einbetten von Images in Pages zu verwenden. Es gibt jedoch schwerwiegende Probleme mit diesem Ansatz:

Nachteile

  • Eingebetteter Inhalt muss extrahiert und decodiert werden, bevor Änderungen vorgenommen werden können, danach erneut codiert und erneut eingebettet werden.
  • Cookies werden nicht unterstützt.
  • Informationen, die mehr als einmal eingebettet sind, werden als Teil der enthaltenen Datei erneut heruntergeladen und profitieren daher nicht vom Cache des Browsers.
  • Browser können die URI-Länge begrenzen und so eine effektive maximale Datengröße schaffen. Zum Beispiel hatten URIs in früheren Versionen von Opera Limits von 4kB und 32kB für IE8 Beta 1 [Zitat benötigt]
  • Daten sind als einfacher Stream enthalten, und viele Verarbeitungsumgebungen (z. B. Webbrowser) unterstützen möglicherweise nicht die Verwendung von Containern (z. B. multipart / alternativ oder message / rfc822), um eine höhere Komplexität wie Metadaten, Datenkomprimierung oder Inhaltsverhandlung bereitzustellen.
  • Microsofts Internet Explorer, bis Version 7 (ca. 70% des Marktes ab Q2 2008), fehlt Unterstützung.

Der bessere Ansatz ist es, eine separate “Image.aspx” -Seite zu verwenden, die Ihren MemoryStream aufnimmt und ausgibt, ähnlich wie in meiner Fotoalbum-Software, die ich erstellt habe, als ich mit ASP.net angefangen habe:

(Lach nicht, das war mein erster Versuch bei ASP.net 🙂

Bearbeiten: Vereinbart auf ASHX, der obige Code zeigt nur eine Beispielimplementierung. Wenn ich das Fotoalbum aktualisiere, wird es ASHX dafür verwenden.

Sie können das BinaryImage-Steuerelement von Telerik für ASP.net verwenden.

Weitere Informationen finden Sie hier: http://www.telerik.com/products/aspnet-ajax/binaryimage.aspx

Nee.

Sie können jedoch eine spezielle Seite erstellen, um das Bild zu streamen. Zuerst legen Sie die URL des Bildes auf der Seite fest, die das Streaming durchführt, einschließlich einiger URL-Parameter, die Sie darüber informieren, wo Sie das Bild erhalten:

  

In GetImage.aspx erhalten Sie den Dateinamen (oder was auch immer) von der URL, laden Sie das Bild in Ihren MemoryStream und schreiben Sie den Inhalt dieses Speicherstreams direkt in die HttpResponse:

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

Für mich war es notwendig “puffer =” false “zu @Page hinzuzufügen. Ansonsten würde ich immer das gleiche Bild bekommen …