【发布时间】:2012-09-29 02:57:14
【问题描述】:
我有一个代表图片的字节数组。我想在 aspx 页面中显示存储在该字节数组中的图片。我可以使用图像或图像映射控件吗?如果是这样 - 如何?如果不是 - 解决方案是什么?
【问题讨论】:
我有一个代表图片的字节数组。我想在 aspx 页面中显示存储在该字节数组中的图片。我可以使用图像或图像映射控件吗?如果是这样 - 如何?如果不是 - 解决方案是什么?
【问题讨论】:
您可以做的另一件更快的事情是不使用 asp.net Image 控件并使用 html 中的基本 img 元素。因此,在您的 asp.net 页面中,创建一个 id 为 img 且 runat 设置为 server 的 img 元素。
然后你可以这样做:
<img id="img" runat="server" alt=""/>
public DataRow ClaimPhotoRow { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
img.Src = "data:image/jpg;base64," + Convert.ToBase64String((byte[])ClaimPhotoRow[0]);
}
【讨论】:
想想在网页中如何提供普通图像 - 文件名在标记中引用,浏览器向服务器发送单独的请求以获取该文件。
这里也适用相同的原则,除了引用静态图像文件之外,您需要引用为图像字节提供服务的 ASP.NET 处理程序:
<img src="/imagehandler.ashx" />
处理程序的缩写如下所示:
public class ImageHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.OutputStream.Write(imageData, 0, imageData.Length);
context.Response.ContentType = "image/JPEG";
}
}
这是在 ASP.NET 中创建 HttpHander 的(长)resource that covers the concepts。
另外,正如 Joel 所指出的,考虑字节数组的来源,因为 HttpHandler 是在与页面完全不同的请求中提供的。在最基本的层面上,这两个请求不知道彼此或共享任何数据。
解决这个问题的一个常见方法是将图像数据放入缓存中:
Guid id = Guid.NewGuid();
HttpRuntime.Cache.Add(id.ToString(), imageData);
并在查询字符串中将密钥传递给 HttpHandler,以便它可以从缓存中获取它:
<img src="/imagehandler.ashx?img=<%=id%>" />
<!-- will print ...ashx?img=42a96c06-c5dd-488c-906f-cf20663d0a43 -->
【讨论】:
您可以编写一个通用的处理程序来提供图片:
<%@ WebHandler Language="C#" Class="Picture" %>
public class Picture : System.Web.IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
byte[] buffer = GetPictureFromSomewhere();
context.Response.ContentType = "image/jpeg";
context.Response.OutputStream.Write(buffer, 0, buffer.Length);
}
public bool IsReusable
{
get { return false; }
}
}
然后在一个aspx页面中调用它:
<asp:Image ID="pic" runat="server" ImageUrl="~/Picture.ashx" />
【讨论】:
以下文章回答了你的问题:Auto-bind byte[] to asp:Image
【讨论】: