我从数据库返回图像数组(System.Drawing.Image []),我想在datagrid或datalist中显示它们。可以告诉我怎么做吗?
答案 0 :(得分:2)
如果图像相当小,您可以使用网页标记发送Base64编码。
请注意:这只是一个演示,以表明可以这样做,我认为这不应该在真实的网站上完成。
实际上,你应该:
这就是说,这是使用base64编码图像的演示。 将Repeater添加到您的页面:
<asp:Repeater ID="ImageRepeater" runat="server">
<ItemTemplate>
<asp:Literal ID="ltImage" runat="server"><img src="data:image/jpg;base64,{0}" alt="" /></asp:Literal>
</ItemTemplate>
</asp:Repeater>
在您的代码隐藏中,将图像绑定到转发器:
private void BindImages(System.Drawing.Image[] images)
{
this.ImageRepeater.DataSource = images;
this.ImageRepeater.ItemDataBound += delegate(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item)
{
System.Drawing.Image img = e.Item.DataItem as System.Drawing.Image;
Literal lt = e.Item.FindControl("ltImage") as Literal;
lt.Text = string.Format(lt.Text, ImageToBase64(img, ImageFormat.Jpeg));
}
};
this.ImageRepeater.DataBind();
}
private string ImageToBase64(System.Drawing.Image image, System.Drawing.Imaging.ImageFormat format)
{
using (MemoryStream ms = new MemoryStream())
{
// Convert Image to byte[]
image.Save(ms, format);
byte[] imageBytes = ms.ToArray();
// Convert byte[] to Base64 String
string base64String = Convert.ToBase64String(imageBytes);
return base64String;
}
}
您可能想禁用Viewstate ...
感谢dailycoding.com和Dean Edwards代码位。
答案 1 :(得分:1)
不,据我所知,没有控制能做到这一点。
基本上您需要做的是在解决方案中添加一个新页面(或处理程序),然后从该页面执行Response.BinaryWrite
将图像直接写入响应。然后在您的主页面中,您将图片链接到新页面类似<img src="MyImage.aspx?Id=1"/>
这些链接应该为您提供一个良好的开端。