Изображение из байта в оптимизированную презентацию веб-страницы - PullRequest
1 голос
/ 07 мая 2010

Я получаю данные сохраненного изображения в базе данных в виде массива 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 из описанного выше метода, как я могу показать его в цикле динамически, используя условия (*) выше.

С уважением Б.К.

1 Ответ

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

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

Я бы выбрал следующее решение:

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

UPDATE:

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

    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);
    }
...