2009-04-16 4 views
2

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

ответ

5

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

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

+0

Большое спасибо, я попробую! – jkottnauer

+1

Убедитесь, что вы кешируете изображения, потому что это, вероятно, не будет масштабировать все это хорошо ... –

+0

Вправо. Кэширование не слишком динамичное, но «сложное вычисление» в ASP.NET обычно является хорошей идеей ... – Lucero

6

Похоже, вам нужно настроить 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 для создания миниатюры, но вы упомянули, что уже позаботились об этом. Вам также необходимо убедиться, что вы правильно настроили заголовки при передаче файла в браузер.

+1

Малой модификацией ... вам нужно вызвать context.Response.TransmitFile (путь); –

1

Http-обработчик - это путь.

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

Смежные вопросы