Изменение размера изображения на лету в asp.net - PullRequest
2 голосов
/ 07 января 2011

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

Ответы [ 4 ]

9 голосов
/ 29 марта 2012

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

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

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

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

1 голос
/ 02 мая 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)

1 голос
/ 07 января 2011

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

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

0 голосов
/ 07 января 2011

Да.

Вы создаете страницу ASP.Net, которая выполняет Response.Clear (), устанавливает заголовок Content-Type в Response и отправляет двоичные данные изображения (также через Response).Размер изображения можно изменить «на лету», но я бы порекомендовал кешировать его некоторое время на диске или около того.Затем вы ссылаетесь на изображение из HTML как image.Для сохранения изображения в памяти перед отправкой вы можете использовать MemStream.

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

...