Изменение размера изображения на лету в asp.net

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


person The Muffin Man    schedule 07.01.2011    source источник
comment
Просто отметим, что полное изображение всегда нужно будет передавать, единственная разница в том, кто будет тянуть его по проводу. При этом вы можете реализовать HttpHandler, который мог бы выполнять манипуляции с изображениями за вас.   -  person Grant Thomas    schedule 07.01.2011
comment
Вы упомянули, что ваши изображения находятся на S3 — ваше приложение работает на одном сервере или это облачное приложение? Загрузка большого изображения и изменение его размера сопряжены с изрядными накладными расходами, что вам не обязательно нужно, если вы запускаете приложение на одном сервере. Возможно, вы захотите создать миниатюру только в том случае, если она еще не была создана, а затем сохранить ее на диске, чтобы вам не приходилось снова запускать код для изображения, пока оно не изменится.   -  person BenAlabaster    schedule 07.01.2011
comment
Проект ImageResizing.Net предлагает как изменение размера изображения S3, так и кэширование диска — это также широко используемое и хорошо протестированное программное обеспечение.   -  person Lilith River    schedule 26.10.2011


Ответы (4)


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

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

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

person Jonathan Wood    schedule 07.01.2011

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

Я написал библиотеку для безопасного динамического изменения размера изображения на стороне сервера. Это не то, что можно сделать правильно за 1 урок или даже за 10. Вы можете решить 80% ошибок, но не 100%. И когда вы делаете что-то ресурсоемкое, вы не можете допустить ошибок или утечек памяти.

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

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

person Lilith River    schedule 29.03.2012
comment
+1 для imageresizing.net — полнофункциональный, быстрый, простой в настройке, расширяемый и доступный. это будет стоить вам гораздо больше, чтобы написать свой собственный, и в конце концов он все равно будет содержать ошибки. - person jaminto; 01.10.2012

Использование класса 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();
}

Подробнее об этом здесь: Измените размер изображения на лету с помощью ASP.NET MVC


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

Работа с изображениями в Сайт веб-страниц ASP.NET (Razor)

person Leniel Maccaferri    schedule 02.05.2012

да.

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

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

person Tedd Hansen    schedule 07.01.2011