如何使用 C# 从字节数组中显示 Web 表单中的图像

Posted

技术标签:

【中文标题】如何使用 C# 从字节数组中显示 Web 表单中的图像【英文标题】:How to display image inside web form from Byte Array with C# 【发布时间】:2013-08-13 04:41:38 【问题描述】:

这是我的代码,它所做的只是清除网页并绘制图像,因此表单的其余部分消失了!我需要在表单中显示图片。

这是用于显示图像的用户控件:

protected void Page_Load(object sender, EventArgs e)
    

        if (Session["ObjHoteles"] == null)
        
            Label1.Text = "Por favor, primero seleccione un hotel para desplegar las fotos.";
        
        else
        
            if (!IsPostBack)
            
                List<Byte[]> ArrayFotos = new List<Byte[]>();
                string NombreDelHotel = "";

                Hoteles Hotel1 = (Hoteles)Session["ObjHoteles"];
                NombreDelHotel = Hotel1.NombreHotel;

                ArrayFotos = Persistencia.PersistenciaFotos.FotosDeHotel(NombreDelHotel);
                Session["CantFotos"] = ArrayFotos.Count();

                Byte[] Foto = ArrayFotos[0];

                Response.Buffer = true;
                Response.Clear();
                Response.ContentType = "image/jpeg";
                Response.Expires = 0;
                Response.BinaryWrite(Foto);
                Session["NumFoto"] = 0;
            
            else
            
                List<Byte[]> ArrayFotos = new List<Byte[]>();
                string NombreDelHotel = "";

                Hoteles Hotel1 = (Hoteles)Session["ObjHoteles"];
                NombreDelHotel = Hotel1.NombreHotel;

                ArrayFotos = Persistencia.PersistenciaFotos.FotosDeHotel(NombreDelHotel);
                Session["CantFotos"] = ArrayFotos.Count();

                Byte[] Foto = ArrayFotos[(int)Session["NumFoto"]];

                Response.Buffer = true;
                Response.Clear();
                Response.ContentType = "image/jpeg";
                Response.Expires = 0;
                Response.BinaryWrite(Foto);

            
        

我需要找到一种不清除所有页面的方法,只需在用户控件内绘制图像。

【问题讨论】:

Hmm.. 请修改您的问题,以便列出使用用户控件来实现此目的的特定需求.. 由您的客户根据我在您的 cmets 中读到的内容提出。 【参考方案1】:

您可以编写一个页面 .aspx 或一个处理程序(可能是 .ashx),将图片的内容发送回浏览器。您可以在 url 中传递信息。 然后使用带有 html 标签或 html 控件的该页面的 url 来显示它。

编辑: 您需要使用控件。您可以将二进制数据转换为base64并将内容输出到html页面。

我给你一个带有img html标签的例子:

<img  src="data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAAsMAAAGhCAIAAAALOi7ZAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3QgLEhM6PUSGrwAAIABJREFUeNq8vcuSLEmWHKZ6jnlEZt5761Z3T/eAHAICAYRcEALsuOCWPzbzDfwP/gKXWJACoRDCBSkEBgPhADKY7qnu+4wIdztHuThmHh55q2t6ho+SlpaqyMwID3ez89CjqsY//dM//bM/+zMc/pGE3//PT/z09/1I0t/1Rz/x+o9+0I++vv/n8fU/8MW/9U9+9JVvL/v/u1cy86cv5ttfePXKq//8fTfhp+/qT3/oq8v+6V/+Ay/v25/+4X/46nqO"/>

您还可以对带有 CSS 的图像使用 base64 编码:

background-image: url(data:image/jpeg;base64,IVB)

要从 C# 转换为 base64,您可以使用:

using System;

和:

Convert.ToBase64String(Foto);

【讨论】:

嗨,我的客户要求我使用用户控件。 您能解释一下如何使用 CSS 和 base64 数据吗? 这不适用于 Internet Explorer 7 和更早版本,因为数据 URI 方案根本不受支持,并且在 Internet Explorer 8 中的支持有限;阅读Data URI scheme了解更多信息。 我在将图像从字节数组转换为 base64 字符串后尝试了这个。直到我从 base64 字符串的末尾删除了尾随的“2Q==”,它才起作用,然后就可以了。【参考方案2】:

还有一种简单的方法:

    在您的.aspx 页面上:

    <asp:Image id="Image1" runat="server"></asp:Image>
    

    然后在你的 CodeBehind 文件中.aspx.cs:

    Image1.ImageUrl = "data:image/jpeg;base64," + Convert.ToBase64String(Foto)
    

【讨论】:

将它用于我的 Web 应用程序,效果很好。正如之前的 cmets 中提到的,我不会太担心 IE7 及以下版本。大多数用户将拥有 IE8 及更高版本或 chrome/firefox 等...大多数人现在使用可用浏览器的最新版本。夏尔 +1【参考方案3】:

Response.Clear(); 正在删除所有缓冲内容(即页面中的所有内容)。

考虑一个 HTTP 处理程序 (.ashx),而不是显示动态图像的用户控件,如下所示:

ImageHandler.ashx:

public class ImageHandler : System.Web.IHttpHandler

    public void ProcessRequest(HttpContext context)
    
        // Logic to get byte array here
        byte[] buffer = WhateverLogicNeeded;
        context.Response.ContentType = "image/jpeg";
        context.Response.OutputStream.Write(buffer, 0, buffer.Length);
    

    public bool IsReusable
    
        get  return false; 
    

然后在您的.aspx 页面中:

<asp:Image ID="image1" runat="server" ImageUrl="~/ImageHandler.ashx" />

注意:如果您想要特定图像,则可以将查询字符串(即图像 ID)传递给处理程序,并让字节数组逻辑帐户用于使用查询字符串值。

【讨论】:

您好,卡尔,感谢您的回答!我的客户特别要求我使用用户控件!

以上是关于如何使用 C# 从字节数组中显示 Web 表单中的图像的主要内容,如果未能解决你的问题,请参考以下文章

C#:从 Web 服务返回的字节 [] 在新选项卡中显示 PDF

如何从字节数组 c# MVC .NET Core 在 iframe 中显示 pdf

在 C# 中将 Base64 字节数组解码为图像

C#如何从字节数组中提取字节?已知起始字节

无法将固定大小的字节数组从结构复制到 C# 结构中的另一个数组

从字节数组运行程序