【问题标题】:How to display image inside web form from Byte Array with C#如何使用 C# 从字节数组中显示 Web 表单中的图像
【发布时间】:2025-12-14 10:05:02
【问题描述】:

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

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

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 中读到的内容提出。

标签: c# asp.net webforms


【解决方案1】:

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

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

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

<img alt="" 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】:

还有一种简单的方法:

  1. 在您的.aspx 页面上:

    <asp:Image id="Image1" runat="server"></asp:Image>
    
  2. 然后在你的 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)传递给处理程序,并让字节数组逻辑帐户用于使用查询字符串值。

【讨论】:

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