如何使用 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