是否有任何控件将System.Drawing.Image对象和视图作为图像?

时间:2010-05-28 16:48:19

标签: asp.net sql-server-2005 image

我从数据库返回图像数组(System.Drawing.Image []),我想在datagrid或datalist中显示它们。可以告诉我怎么做吗?

2 个答案:

答案 0 :(得分:2)

如果图像相当小,您可以使用网页标记发送Base64编码。

请注意:这只是一个演示,以表明可以这样做,我认为这不应该在真实的网站上完成。

实际上,你应该:

  • 考虑将这些图像写入磁盘并将其作为常规图像提供,并使用正确的缓存标头,而不是每次都访问数据库。
  • 实现一个处理程序,它首先检查图像是否已存在于磁盘上,并且只在需要时才从数据库中检索它(这只是第一次要求图像)。
  • 使用 url重写,并仅将与磁盘上的图像不对应的图片网址传递给处理程序。这比通过ASP.Net管道传递所有请求更快。 IIRF做得非常好。

这就是说,这是使用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.comDean Edwards代码位。

答案 1 :(得分:1)

不,据我所知,没有控制能做到这一点。

基本上您需要做的是在解决方案中添加一个新页面(或处理程序),然后从该页面执行Response.BinaryWrite将图像直接写入响应。然后在您的主页面中,您将图片链接到新页面类似<img src="MyImage.aspx?Id=1"/>

这些链接应该为您提供一个良好的开端。

http://odetocode.com/articles/172.aspx

http://www.4guysfromrolla.com/articles/120606-1.aspx