2011-01-07 6 views
2

Для простоты скажем, что у меня есть веб-страница, которая должна отображать миниатюры изображений. Расположение изображений хранится в базе данных (изображения хранятся на Amazon S3). Возможно ли, чтобы мой веб-сервер уменьшил масштабное изображение до его доставки клиенту? Таким образом, мне не нужно сохранять миниатюры каждого изображения, и клиент может загрузить меньший файл.Изменение размера изображения на лету в asp.net

+0

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

+2

Вы упомянули, что ваши изображения находятся на S3 - ваше приложение запускается на одном сервере или является облачным приложением? Накладные расходы на загрузку большого изображения и изменение размера, которое вам не обязательно нужно, если вы используете приложение на одном сервере. Возможно, вы захотите создать только миниатюру, если она еще не была создана, а затем сохраните ее на диске, чтобы вам не пришлось снова запускать код на изображении, если он не изменится. – BenAlabaster

+0

Проект [ImageResizing.Net] (http://imageresizing.net) предлагает как изменение размера изображения S3, так и кэширование диска - это также широко используемое и хорошо протестированное программное обеспечение. –

ответ

1

Несомненно, проблем нет. В Интернете много ресурсов, которые показывают, как отображать изображение из базы данных. Поэтому я не буду дублировать это здесь.

Как только вы загрузили изображение, вы можете легко сжать его с помощью .NET. Ниже приведен пример следующего URL-адреса. Это не делает именно то, что вы делаете, но оно создает эскизы изображения.

http://blackbeltcoder.com/Articles/graphics/creating-website-thumbnails-in-asp-net

0

Да.

Вы создаете страницу ASP.Net, которая выполняет Response.Clear(), устанавливает Content-Type-header в Response и отправляет двоичные данные изображения (также через Response). Изображение может быть изменено «на лету», но я бы рекомендовал кэшировать его некоторое время на диске или около того. Затем вы ссылаетесь на изображение из HTML как < img src = "http: //server/yourimagepage.aspx" >. Для хранения изображения в памяти перед отправкой вы можете использовать MemStream.

У меня есть пример кода, но не передо мной прямо сейчас, извините. :)

9

Каждый учебник по этому вопросу упрощает ситуацию и почти все из них утечка памяти. Это длинное чтение, но you should know about the 29 image resizing pitfalls, чтобы вы могли их избежать.

I wrote a library to do server-side dynamic image resizing safely. Это не то, что можно сделать правильно в 1 учебнике или даже 10. Вы можете решить 80% ошибок, но не 100%. И когда вы делаете что-то такое ресурсоемкое, вы не можете терпеть ошибки или утечки памяти.

Основная библиотека является бесплатной и с открытым исходным кодом, но плагин Amazon S3 является частью выпуска Performance, который имеет лицензионный сбор в размере 249 долларов США. Performance Edition поставляется с источниками, примерами и документацией для интеграции S3, MS SQL, Azure, MongoDB GridFS и CloudFront, а также кэширования и кэширования кэширования на терабайтном уровне.

Из статистики, к которой у меня есть доступ, похоже, что imageresizing.net является наиболее широко используемой библиотекой такого рода. Он работает как минимум в 5 социальных сетях и используется с коллекциями изображений размером до 20 ТБ. На большинстве крупных сайтов используется плагин S3, поскольку локальное хранилище (или даже SAN) не очень масштабируемо.

+2

+1 для imageresizing.net - это полнофункциональный, быстрый, простой в настройке, расширяемый и доступный. это будет стоить вам больше, чтобы написать свои собственные, и в любом случае это будет ужасно. – jaminto

1

Используя WebImage класс, который поставляется в System.Web.Helpers.WebImage, вы можете достичь этого.

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

Пример кода:

public void GetPhotoThumbnail(int realtyId, int width, int height) 
{ 
    // Loading photos’ info from database for specific Realty... 
    var photos = DocumentSession.Query<File>().Where(f => f.RealtyId == realtyId); 

    if (photos.Any()) 
    { 
     var photo = photos.First(); 

     new WebImage(photo.Path) 
      .Resize(width, height, false, true) // Resizing the image to 100x100 px on the fly... 
      .Crop(1, 1) // Cropping it to remove 1px border at top and left sides (bug in WebImage) 
      .Write(); 
    } 

    // Loading a default photo for realties that don't have a Photo 
     new WebImage(HostingEnvironment.MapPath(@"~/Content/images/no-photo100x100.png")).Write(); 
} 

Подробнее об этом здесь: Resize image on the fly with ASP.NET MVC


Вот отличный учебник, который показывает, как работать с WebImage непосредственно из ASP.NET сайт:

Working with Images in an ASP.NET Web Pages (Razor) Site