Каков наилучший способ отображения миниатюр в ASP.NET? - PullRequest
2 голосов
/ 16 апреля 2009

Я создаю обычную галерею в ASP.NET, но у меня мало опыта по созданию миниатюр. Я знаю алгоритмы и метод GetThumbnailImage, но моя проблема в другом месте - в настоящее время я отображаю изображения (только что изменил размер) с помощью элемента управления ImageButton. И в том-то и дело - я понятия не имею, как подключить изображение «thumbnailed» к свойству ImageUrl. Это вообще возможно и если да, то как? Или я должен использовать какой-то другой элемент управления? Спасибо за любые предложения!

Ответы [ 3 ]

6 голосов
/ 16 апреля 2009

Похоже, вам нужно настроить HttpHandler, который будет создавать измененный размер изображения и, возможно, также кэшировать его на диск, чтобы избежать необходимости воссоздавать миниатюру при каждом запросе.

Так, например:

<asp:ImageButton ID="ImageButton1" ImageUrl="~/ImageHandler.ashx?ImageId=123" runat="server />

Тогда у вас будет обработчик:

namespace MyProject
{
    public class ImageHandler : IHttpHandler
    {
        public virtual void ProcessRequest(HttpContext context)
        {
            // 1. Get querystring parameter
            // 2. Check if resized image is in cache
            // 3. If not, create it and cache to disk
            // 5. Send the image

            // Example Below
            // -------------

            // Get ID from querystring
            string id = context.Request.QueryString.Get("ImageId");

            // Construct path to cached thumbnail file
            string path = context.Server.MapPath("~/ImageCache/" + id + ".jpg");

            // Create the file if it doesn't exist already
            if (!File.Exists(path))
                CreateThumbnailImage(id);

            // Set content-type, content-length, etc headers

            // Send the file
            Response.TransmitFile(path);
        }

        public virtual bool IsReusable
        {
            get { return true; }
        }
    }
}

Вам также нужно настроить это в web.config

<system.web>
    <httpHandlers>
        <add verb="*" path="ImageHandler.ashx" type="MyProject.ImageHandler, MyProject"/>
    </httpHandlers>
</system.web>

Этого должно быть достаточно, чтобы вы начали. Вам нужно будет изменить метод ProcessRequest для создания эскиза, но вы уже упоминали, что позаботились об этом. Вам также необходимо убедиться, что вы правильно установили заголовки при передаче файла в браузер.

5 голосов
/ 16 апреля 2009

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

Всякий раз, когда вы делаете графические вещи в ASP.NET, имейте в виду, что почти все System.Drawing является оберткой для GDI + и поэтому содержит ссылки на неуправляемую память, которая должна быть правильно расположена using заявление). Это справедливо даже для простых классов, таких как StringFormat и т. Д.

1 голос
/ 16 апреля 2009

Http Handler это путь.

Еще одно замечание о производительности: манипулирование изображениями является дорогостоящим по отношению к месту на диске, как с точки зрения памяти, так и с точки зрения процессора. Поэтому создание эскиза из полного изображения - это то, что вы хотите сделать только один раз для каждого полного изображения. Лучшее время для этого, вероятно, во время загрузки изображения, особенно если вы будете показывать их несколько на одной странице.

...