【问题标题】:bytearray to image asp.netbytearray 到图像 asp.net
【发布时间】:2012-09-29 02:57:14
【问题描述】:

我有一个代表图片的字节数组。我想在 aspx 页面中显示存储在该字节数组中的图片。我可以使用图像或图像映射控件吗?如果是这样 - 如何?如果不是 - 解决方案是什么?

【问题讨论】:

    标签: asp.net image bytearray


    【解决方案1】:

    您可以做的另一件更快的事情是不使用 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]);
    
    }
    

    【讨论】:

    • 聪明的解决方案。请注意,版本 8 之前的 IE 不能使用数据 url 方案caniuse.com/datauri
    • 非常感谢您用最少的步骤解决了我的问题。
    【解决方案2】:

    想想在网页中如何提供普通图像 - 文件名在标记中引用,浏览器向服务器发送单独的请求以获取该文件。

    这里也适用相同的原则,除了引用静态图像文件之外,您需要引用为图像字节提供服务的 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 -->
    

    【讨论】:

    • +1 - 另请注意,这意味着您可能需要重新考虑当前页面的工作方式,因为您可能在处理对不同资源的请求的过程中获得了字节数组。
    【解决方案3】:

    您可以编写一个通用的处理程序来提供图片:

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

    【讨论】:

      【解决方案4】:

      以下文章回答了你的问题:Auto-bind byte[] to asp:Image

      【讨论】:

        猜你喜欢
        • 2016-08-15
        • 1970-01-01
        • 2015-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-01
        • 2011-12-15
        相关资源
        最近更新 更多