Есть ли какой-либо элемент управления, который принимает объект System.Drawing.Image и просматривает его как изображение? - PullRequest
0 голосов
/ 28 мая 2010

Я возвращаю массив изображений (System.Drawing.Image []) из базы данных и хочу показать их в сетке данных или в списке данных. Кто-нибудь может сказать мне, как это сделать?

Ответы [ 2 ]

2 голосов
/ 29 мая 2010

Если изображения довольно маленькие, вы можете отправить их в формате Base64 с кодировкой веб-страницы.

Обратите внимание : Это только демонстрация, чтобы показать, что это возможно, я не думаю, что это следует делать на реальном веб-сайте.

На самом деле вы должны:

  • рассмотрим запись этих образов на диск и их использование в качестве обычных изображений с надлежащими заголовками кэширования, не обращаясь к базе данных каждый раз.
  • реализует обработчик , который сначала проверяет, существует ли изображение на диске, и извлекает его из БД только при необходимости (это будет только первый раз, когда запрашивается изображение).
  • использовать перезапись URL и передавать обработчику только те URL-адреса изображений, которые не соответствуют изображению на диске. Это быстрее, чем пропускать все запросы через канал ASP.Net. IIRF делает это на отлично.

Это говорит о том, что здесь демонстрация с закодированными в base64 изображениями. Добавьте Ретранслятор на свою страницу:

<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 и Дину Эдвардсу за биты кода.

1 голос
/ 28 мая 2010

Нет, насколько я знаю, нет никакого контроля, который делает это.

По сути, вам нужно добавить новую страницу (или обработчик) к вашему решению, и с этой страницы вы делаете Response.BinaryWrite, чтобы записать изображение непосредственно в ответ. Затем на главной странице вы связываете изображение с этой новой страницей, вроде <img src="MyImage.aspx?Id=1"/>

Эти ссылки должны послужить хорошим началом.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...