Обработка изображений на C#: resize, crop библиотекой ImageSharp

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Работа с изображениями на C# (.NET): изменение размера и обрезка (resize, crop)

В современной веб-разработке и создании десктопных приложений часто возникает необходимость программно обрабатывать изображения: изменять их размер (resize) для превью, обрезать (crop) лишние края или адаптировать под определённый формат. Платформа .NET предлагает несколько подходов к решению этих задач. В этой статье мы подробно разберём работу с библиотекой SixLabors.ImageSharp — мощным, кросс-платформенным инструментом для обработки изображений на C#.

Почему ImageSharp?

Ранее стандартным решением была библиотека System.Drawing, но она имеет ограничения: работает только на Windows, требует установленных GDI+ компонентов и не оптимизирована для современных веб-приложений. ImageSharp лишена этих недостатков:

  • Полностью написана на управляемом коде C#.
  • Работает на Windows, Linux, macOS.
  • Поддерживает популярные форматы: JPEG, PNG, BMP, GIF, WebP.
  • Высокая производительность и безопасность.

Установка библиотеки

Для начала создайте новый проект C# (.NET 6+) и установите пакет через NuGet:

dotnet add package SixLabors.ImageSharp

Или через менеджер пакетов Visual Studio: Install-Package SixLabors.ImageSharp.

Изменение размера изображения (Resize)

Функция resize позволяет уменьшить или увеличить картинку, сохраняя пропорции или задавая точные размеры. Рассмотрим пример, где мы загружаем изображение и уменьшаем его до ширины 300 пикселей, автоматически подстраивая высоту:

using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Processing;

// Загрузка исходного изображения
using (Image image = Image.Load("input.jpg"))
{
    // Изменение размера: ширина 300, высота рассчитывается автоматически
    image.Mutate(x => x.Resize(300, 0));

    // Сохранение результата
    image.Save("output_resize.jpg");
}

Вторым параметром 0 мы указываем, что высота должна быть вычислена автоматически для сохранения пропорций. Если нужно задать точные размеры (например, 300x200), укажите оба значения:

image.Mutate(x => x.Resize(300, 200)); // Возможно искажение пропорций

Для сохранения пропорций с точным размером используйте режим ResizeMode.Pad или ResizeMode.Crop:

image.Mutate(x => x.Resize(new ResizeOptions
{
    Size = new Size(300, 200),
    Mode = ResizeMode.Crop // Обрежет края, чтобы вписать в размер
}));

Обрезка изображения (Crop)

Обрезка (crop) позволяет вырезать прямоугольную область из исходного изображения. Это полезно для создания аватарок, миниатюр или удаления пустых полей. Пример — вырезаем центральную область размером 200x150 пикселей:

using (Image image = Image.Load("input.jpg"))
{
    // Определяем координаты и размер области для обрезки
    Rectangle cropRect = new Rectangle(
        x: (image.Width - 200) / 2,   // Центрируем по горизонтали
        y: (image.Height - 150) / 2,  // Центрируем по вертикали
        width: 200,
        height: 150
    );

    // Выполняем обрезку
    image.Mutate(x => x.Crop(cropRect));

    // Сохраняем результат
    image.Save("output_crop.jpg");
}

Если нужно обрезать изображение вручную (например, верхний левый угол 100x100):

image.Mutate(x => x.Crop(new Rectangle(0, 0, 100, 100)));

Комбинирование операций: resize + crop

Часто требуется сначала изменить размер, а затем обрезать до нужного формата. ImageSharp позволяет объединять операции в цепочку:

using (Image image = Image.Load("input.jpg"))
{
    // Шаг 1: уменьшаем до ширины 400 пикселей (пропорционально)
    image.Mutate(x => x.Resize(400, 0));

    // Шаг 2: обрезаем центральную область 300x300
    int cropSize = 300;
    int x = (image.Width - cropSize) / 2;
    int y = (image.Height - cropSize) / 2;
    image.Mutate(x => x.Crop(new Rectangle(x, y, cropSize, cropSize)));

    image.Save("output_combined.jpg");
}

Или более компактно с использованием ResizeMode.Crop:

image.Mutate(x => x.Resize(new ResizeOptions
{
    Size                    

Рекомендаций