Изображение из байта в оптимизированную презентацию веб-страницы

Я получаю данные сохраненного изображения в базе данных в виде массива byte[]; затем я конвертирую его в System.Drawing.Image, как показано ниже;

  public System.Drawing.Image CreateImage(byte[] bytes)
        {

            System.IO.MemoryStream memoryStream = new System.IO.MemoryStream(bytes);
            System.Drawing.Image image = System.Drawing.Image.FromStream(memoryStream);
            return image;
        }

(*) С другой стороны, я планирую показать список изображений на страницах asp.net, когда клиент прокручивает страницу вниз. Чем больше пользователь опускается на страницу, которую он / она видит, тем больше фотографий. Так что это означает быструю загрузку страниц и богатый пользовательский опыт. (вы можете увидеть, что я имею в виду на www.mashable.com, просто позаботьтесь о новых загрузках фотографий, когда будете прокручивать страницу вниз.)

Кроме того, возвращенный объект imgae из метода выше, как я могу показать его в цикле динамически, используя условия (*) выше.

С уважением BK

1 ответ

Решение

Ну, я думаю, что главным узким местом является попадание в базу данных каждый раз, когда вам нужно изображение. (Особенно учитывая, что многие пользователи заходят на сайт.)

Я бы пошел со следующим решением:

  1. База данных будет хранить изображения с оригинальным качеством;
  2. Обработчик.ashx будет кэшировать изображения в файловой системе в различных необходимых разрешениях (например, 32x32 пикселя для значков, 48x48 для миниатюр и т. д.), возвращая их по запросу и получая доступ к базе данных только один раз; (в этом примере показано, как вернуть изображение с помощью обработчика ashx)
  3. Фактические страницы будут указывать на страницу.ashx, чтобы получить изображение. (лайк <img scr="GetImage.ashx?ID=324453&Size=48" />)

ОБНОВИТЬ:

Таким образом, фактический рабочий процесс в обработчике будет выглядеть так:

    public void ProcessRequest (HttpContext context)
    {
        // Create path of cached file based on the context passed
        int size = Int32.Parse(context.Request["Size"]);
        // For ID Guids are possibly better
        // but it can be anything, even parameter you need to pass
        // to the web service in order to get those bytes
        int id = Int32.Parse(context.Request["Id"]);
        string imagePath = String.Format(@"images/cache/{0}/{1}.png", size, id);

        // Check whether cache image exists and created less than an hour ago
        // (create it if necessary)
        if (!File.Exists(imagePath)
            || File.GetLastWriteTime(imagePath) < DateTime.Now.AddHours(-1))
        {
            // Get the file from the web service here
            byte[] imageBytes = ...

            // Save as a file
            using (var memoryStream = new MemoryStream(imageBytes))
            using (var outputStream = File.OpenWrite(imagePath))
                Image.FromStream(memoryStream).Save(outputStream);
        }

        context.Response.ContentType = "image/png";
        context.Response.WriteFile(imagePath);
    }
Другие вопросы по тегам