如何将一个MemoryStream绑定到asp:image控件?

有没有办法将一个MemoryStream绑定到asp:image控件?

处理程序可以像其他请求一样接受url参数。 所以不是把你的<asp:image/>image.ashx而是将它设置为image.ashx?ImageID=[Your image ID here]

最好的办法是创build一个可以返回图像的HttpHandler。 然后将asp:Image上的ImageUrl属性绑定到HttpHandler的url。

这是一些代码。

首先创buildHttpHandler:

 <%@ 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); } } 

接下来,只需在您使用asp:Image的aspx页面中调用它即可。

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

就是这样。

我假设你需要从asp.net生成dynamic图像你可能是运气好的http://www.codeplex.com/aspnet/Release/ProjectReleases.aspx?ReleaseId=16449

Hanselman最近在博客上写道:http://www.hanselman.com/blog/ASPNETFuturesGeneratingDynamicImagesWithHttpHandlersGetsEasier.aspx

@ Will和Ben Griswald:而不是“image.aspx”使用“image.ashx”。

它比一个完整的ASP.Net页面更轻量级,它专门devise用于处理除text / html之外的内容types。

虽然将一个MemoryStream数据绑定到一个图像是不可能的,但是可以使用Label / GenericControl,一些代码和数据URIscheme将图像embedded页面中,但这种方法存在严重的问题:

缺点

  • embedded式内容必须在进行更改之前提取和解码,然后进行重新编码和重新embedded。
  • Cookies不受支持。
  • 不止一次embedded的信息将作为包含文件的一部分重新加载,因此不会受益于浏览器的caching。
  • 浏览器可能会限制URI的长度,创build一个有效的最大数据大小。 例如,以前版本的Opera的URI有4kB的限制,而IE8 Beta 1的限制为32kB [需要的引证]
  • 数据包含在一个简单的stream中,许多处理环境(如Web浏览器)可能不支持使用容器(如multipart / alternative或message / rfc822)来提供更高的复杂性,如元数据,数据压缩或内容协商。
  • 微软的IE浏览器到2008年第二季度的市场份额为70%,缺乏支持。

更好的方法是使用一个单独的“Image.aspx”页面,输出和输出您的MemoryStream,就像我在我开始学习ASP.net时创build的相册软件一样:

(别笑,那是我第一次尝试ASP.net 🙂

编辑:同意ASHX,上面的代码只是显示一个示例实现。 当我来到更新相册时,它将使用ASHX。

您可以将Telerik的BinaryImage控件用于ASP.net。

更多信息在这里: http : //www.telerik.com/products/aspnet-ajax/binaryimage.aspx

不。

但你可以创build一个特殊的页面来stream出这个图像。 首先,您将图像的URL设置为执行stream式处理的页面,其中包括一些可让您知道从哪里获取图像的url参数:

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

在GetImage.aspx中,你得到了URL的文件名(或其他),在你的MemoryStream中加载图像,然后直接将该内存stream的内容写入HttpResponse:

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

对我来说,有必要在@页面中添加“buffer =”false“,否则我会一直得到相同的图片。