Для простоты скажем, что у меня есть веб-страница, которая должна отображать миниатюры изображений. Расположение изображений хранится в базе данных (изображения хранятся на Amazon S3). Возможно ли, чтобы мой веб-сервер уменьшил масштабное изображение до его доставки клиенту? Таким образом, мне не нужно сохранять миниатюры каждого изображения, и клиент может загрузить меньший файл.Изменение размера изображения на лету в asp.net
ответ
Несомненно, проблем нет. В Интернете много ресурсов, которые показывают, как отображать изображение из базы данных. Поэтому я не буду дублировать это здесь.
Как только вы загрузили изображение, вы можете легко сжать его с помощью .NET. Ниже приведен пример следующего URL-адреса. Это не делает именно то, что вы делаете, но оно создает эскизы изображения.
http://blackbeltcoder.com/Articles/graphics/creating-website-thumbnails-in-asp-net
Да.
Вы создаете страницу ASP.Net, которая выполняет Response.Clear(), устанавливает Content-Type-header в Response и отправляет двоичные данные изображения (также через Response). Изображение может быть изменено «на лету», но я бы рекомендовал кэшировать его некоторое время на диске или около того. Затем вы ссылаетесь на изображение из HTML как < img src = "http: //server/yourimagepage.aspx" >. Для хранения изображения в памяти перед отправкой вы можете использовать MemStream.
У меня есть пример кода, но не передо мной прямо сейчас, извините. :)
Каждый учебник по этому вопросу упрощает ситуацию и почти все из них утечка памяти. Это длинное чтение, но 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) не очень масштабируемо.
+1 для imageresizing.net - это полнофункциональный, быстрый, простой в настройке, расширяемый и доступный. это будет стоить вам больше, чтобы написать свои собственные, и в любом случае это будет ужасно. – jaminto
Используя 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 сайт:
Просто отметить, что полное изображение всегда будет необходимо передать, разница только в том, кого будет тянуть его вниз провод. При этом вы можете реализовать «HttpHandler», который может выполнять манипуляции с изображениями для вас. –
Вы упомянули, что ваши изображения находятся на S3 - ваше приложение запускается на одном сервере или является облачным приложением? Накладные расходы на загрузку большого изображения и изменение размера, которое вам не обязательно нужно, если вы используете приложение на одном сервере. Возможно, вы захотите создать только миниатюру, если она еще не была создана, а затем сохраните ее на диске, чтобы вам не пришлось снова запускать код на изображении, если он не изменится. – BenAlabaster
Проект [ImageResizing.Net] (http://imageresizing.net) предлагает как изменение размера изображения S3, так и кэширование диска - это также широко используемое и хорошо протестированное программное обеспечение. –