Сжатие изображений с помощью ImageResizer

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core

Последнее обновление: 1.11.2015

Для сжатия изображений при загрузке на сервере в приложении ASP.NET MVC можно использовать стандартные классы из пространства имен System.Drawing, например, Image и Bitmap, и вручную проводить все масштабирование. Но можно также воспользоваться готовыми решениями. В частности библиотекой ImageResizer.

Чтобы добавить ее функциональность в проект, необходимо через NuGet добавить последовательно ряд пакетов:

ImageResizer.WebConfig
ImageResizer.Plugins.DiskCache
ImageResizer.Plugins.PrettyGifs
Библиотека ImageResizer в ASP.NET MVC 5

После добавления пакетов в файл конфигурации web.config добавляется определение модуля для работы с изображениями:

<modules>
    <add name="ImageResizingModule" type="ImageResizer.InterceptModule" />
</modules>

Тепер применим библиотеку при загрузке файла:

using ImageResizer;
//...........................

[HttpPost]
public ActionResult Upload(HttpPostedFileBase upload)
{
    if (upload != null)
    {
		var path = Server.MapPath("~/Files/");
        upload.InputStream.Seek(0, System.IO.SeekOrigin.Begin);

        ImageBuilder.Current.Build(
            new ImageJob(
                upload.InputStream,
                path + upload.FileName,
                new Instructions("maxwidth=600&maxheight=600"),
                false,
                false));
    }
    return RedirectToAction("Index");
}

Для создания нового изображения применяется метод ImageBuilder.Current.Build(), который в качестве параметра принимает объект ImageJob. Конструктор данного объекта принимает ряд перегруженных версий.

В данном случае первый параметр указывает на поток, который надо сохранить.

Второй параметр определяет полный путь к сохраняемому файлу, включая его имя.

Третий параметр задает инструкции сохранения. В чаcтности, инструкция "maxwidth=600&maxheight=600" задает максимальные размеры файла. И если размеры загружаемого файлы выходят за эти границы, то изображение должным образом масштабируется. В данном случае в качестве максимально допустимых размеров задаются ширина в 600 пикселей и высота также в 600 пикселей.

Четвертый булевый параметр задает, будет ли вызываться после использования объекта, представляющего изображение, метод Dispose ( если иточник изображения представляет объект IDisposable).

Пятый параметр задает добавление формата. Например, мы могли бы использовать следующую инструкцию: "maxwidth=600&maxheight=600&format=jpg". И если данный параметр имел бы значение true, то после сжатия в имени файла после уже имеющегося раширения добавлялось бы расширение ".jpg", а само загруженное изображение использовало бы формат jpg вне зависимости от того, какой формат у него был ранее.

Если необходимо создавать по несколько версий для каждого изображения: малый, средний и большой форматы (например, при показе эскизов отображать только изображения малого формата, а при загрузке изображения отдавать файл в большом формате), то в этом случае мы моем воспользоваться набором инструкций:

[HttpPost]
public ActionResult Upload(HttpPostedFileBase upload)
{
    if (upload != null)
    {
		var path = Server.MapPath("~/Files/");
		// получаем расширение
        var ext = upload.FileName.Substring(upload.FileName.LastIndexOf(".") + 1);
        
		// создаем инструкции для различных версий
        var versions = new Dictionary<string, string>();
        versions.Add("_small", "maxwidth=400&maxheight=400&format="+ext);
        versions.Add("_medium", "maxwidth=600&maxheight=600&format=" + ext);
        versions.Add("_large", "maxwidth=900&maxheight=900&format=" + ext);

		foreach (var suffix in versions.Keys)
        {
            upload.InputStream.Seek(0, System.IO.SeekOrigin.Begin);

            ImageBuilder.Current.Build(
                new ImageJob(
                    upload.InputStream,
                    path + upload.FileName.Remove(upload.FileName.LastIndexOf("."))+ suffix,
                    new Instructions(versions[suffix]),
                    false,
                    true));
        }
    }
    return RedirectToAction("Index");
}

В этом случае в папке для загруженных файлов появятся по три копии для каждого файла с именами: filename_large.ext, filename_medium.ext и filename_small.ext

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850