Работа с изображениями на 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