Frage

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

War es hilfreich?

Lösung

Ein Handler kann einen URL-Parameter wie jede andere Anfrage akzeptieren.Anstatt also Ihre zu verlinken <asp:image/> Zu image.ashx du würdest es einstellen image.ashx?ImageID=[Your image ID here].

Andere Tipps

Am besten erstellen Sie einen HttpHandler, der das Bild zurückgibt.Binden Sie dann die ImageUrl-Eigenschaft für asp:Image an die URL des HttpHandlers.

Hier ist ein Code.

Erstellen Sie zunächst 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("<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);
   }
}

Als nächstes rufen Sie es einfach auf Ihrer ASPX-Seite auf, auf der 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">

<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>

Und das ist alles.

Ich gehe davon aus, dass Sie dynamische Bilder von ASP.NET generieren müssen.http://www.codeplex.com/aspnet/Release/ProjectReleases.aspx?ReleaseId=16449

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

@Will und Ben Griswald:Anstelle von „image.aspx“ verwenden Sie „image.ashx“.

Es ist leichter als eine vollständige ASP.Net-Seite und wurde speziell für die Verarbeitung anderer Inhaltstypen als Text/HTML entwickelt.

Während die Datenbindung eines MemoryStream an ein Bild nicht möglich ist, könnte es möglich sein, ein Label/GenericControl, etwas Code und das zu verwenden Daten-URI-Schema Bilder in Seiten einzubetten, es gibt jedoch schwerwiegende Probleme bei diesem Ansatz:

Nachteile

  • Eingebettete Inhalte müssen extrahiert und dekodiert werden, bevor Änderungen vorgenommen werden können, und anschließend neu kodiert und erneut eingebettet werden.
  • Cookies werden nicht unterstützt.
  • Mehr als einmal eingebettete Informationen werden als Teil der enthaltenden Datei erneut heruntergeladen und profitieren daher nicht vom Cache des Browsers.
  • Browser können die URI-Länge begrenzen, wodurch eine effektive maximale Datengröße entsteht.Beispielsweise hatten URIs in früheren Versionen von Opera Beschränkungen von 4 KB und 32 KB für IE8 Beta 1[Zitat erforderlich]
  • Daten werden als einfacher Stream eingebunden, und viele Verarbeitungsumgebungen (z. B. Webbrowser) unterstützen möglicherweise nicht die Verwendung von Containern (z. B. multipart/alternative oder message/rfc822), um größere Komplexität wie Metadaten, Datenkomprimierung oder Inhaltsaushandlung bereitzustellen.
  • Für den Internet Explorer von Microsoft bis Version 7 (rund 70 % des Marktes im zweiten Quartal 2008) fehlt die Unterstützung.

Der bessere Ansatz besteht darin, eine separate „Image.aspx“-Seite zu verwenden, die Ihren MemoryStream aufnimmt und ausgibt, ähnlich wie ich es in meiner Fotoalbum-Software gemacht habe, die ich erstellt habe, als ich anfing, ASP.net zu lernen:

(Lachen Sie nicht, das war mein erster Versuch bei ASP.net :-)

Bearbeiten:In Übereinstimmung mit ASHX dient der obige Code nur dazu, eine Beispielimplementierung zu zeigen.Wenn ich das Fotoalbum aktualisiere, wird ASHX dafür verwendet.

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

Weitere Infos hier:http://www.telerik.com/products/aspnet-ajax/binaryimage.aspx

Nein.

Sie können jedoch eine spezielle Seite erstellen, um dieses 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 Ihnen mitteilen, wo Sie das Bild erhalten:

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

In GetImage.aspx erhalten Sie den Dateinamen (oder was auch immer) von der URL, laden das Bild in Ihren MemoryStream und schreiben dann 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, „buffer="false" zur @Page hinzuzufügen.Sonst würde ich immer das gleiche Bild bekommen...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top