Для простоты скажем, что у меня есть веб-страница, на которой нужно отображать миниатюры изображений. Расположение изображений хранится в базе данных (изображения хранятся на Amazon S3). Возможно ли, чтобы мой веб-сервер уменьшил большое изображение перед его доставкой клиенту? Таким образом, мне не нужно хранить эскизы каждого изображения, и клиент может загрузить файл меньшего размера.
Изменение размера изображения на лету в asp.net
Ответы (4)
Конечно, нет проблем. В Интернете есть множество ресурсов, которые показывают, как получить изображение из базы данных. Поэтому я не буду дублировать это здесь.
После того, как вы загрузили изображение, вы можете легко уменьшить его с помощью .NET. Пример находится по следующему URL-адресу. Он не делает именно то, что делаете вы, но создает эскизы изображений.
http://blackbeltcoder.com/Articles/graphics/creating-website-thumbnails-in-asp-net
Каждое руководство по этой теме чрезмерно упрощает ситуацию, и почти все из них приводят к утечке памяти. Это долго читать, но вы должны знать о 29 ловушках, связанных с изменением размера изображения так что вы можете избежать их.
Я написал библиотеку для безопасного динамического изменения размера изображения на стороне сервера. Это не то, что можно сделать правильно за 1 урок или даже за 10. Вы можете решить 80% ошибок, но не 100%. И когда вы делаете что-то ресурсоемкое, вы не можете допустить ошибок или утечек памяти.
Основная библиотека бесплатна и имеет открытый исходный код, но плагин Amazon S3 является частью версии Performance, за лицензию на которую взимается 249 долларов. Performance Edition поставляется с исходным кодом, примерами и документацией для интеграции S3, MS SQL, Azure, MongoDB GridFS и CloudFront, а также для дискового кэширования и кэширования памяти в терабайтном масштабе.
Судя по имеющимся у меня статистическим данным, imageresizing.net является наиболее широко используемой библиотекой в своем роде. Он работает как минимум с 5 социальными сетями и используется с коллекциями изображений размером до 20 ТБ. Большинство крупных сайтов используют плагин S3, так как локальное хранилище (или даже SAN) не очень масштабируемо.
Использование класса 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)
да.
Вы создаете страницу ASP.Net, которая выполняет Response.Clear(), устанавливает заголовок Content-Type в Response и отправляет двоичные данные изображения (также через Response). Размер изображения можно изменить на лету, но я бы рекомендовал кэшировать его на некоторое время на диске или около того. Затем вы ссылаетесь на изображение из HTML как ‹img src="http://server/yourimagepage.aspx"›. Для сохранения изображения в памяти перед отправкой вы можете использовать MemStream.
У меня есть пример кода, но сейчас его нет передо мной, извините. :)
HttpHandler
, который мог бы выполнять манипуляции с изображениями за вас. - person Grant Thomas   schedule 07.01.2011