ImageSharp для C# (.NET): полное руководство с примерами
1. Что это и зачем нужна?
ImageSharp — это мощная, полностью управляемая, кроссплатформенная библиотека для обработки изображений, написанная на C# для экосистемы .NET. Она является частью семейства библиотек SixLabors и предоставляет разработчикам чистый, безопасный и высокопроизводительный API для работы с изображениями без необходимости использования внешних нативных зависимостей (таких как ImageMagick, SkiaSharp или GDI+). Это означает, что ImageSharp работает одинаково хорошо на Windows, Linux и macOS, что делает её идеальным выбором для веб-приложений (ASP.NET Core), микросервисов, консольных утилит и мобильных приложений (через Xamarin/MAUI).
Зачем нужна ImageSharp? В современной разработке обработка изображений требуется повсеместно: от создания миниатюр для галерей и изменения размера аватарок пользователей до наложения водяных знаков, применения фильтров и конвертации форматов. ImageSharp предлагает всё это "из коробки" с акцентом на производительность и безопасность. В отличие от устаревшего System.Drawing, который привязан к Windows и имеет проблемы с потоками, ImageSharp является потокобезопасной и полностью кроссплатформенной. Она также активно поддерживается сообществом и имеет подробную документацию.
Ключевые возможности библиотеки включают: загрузку и сохранение изображений в популярных форматах (JPEG, PNG, BMP, GIF, WebP, TIFF), изменение размера, обрезку, поворот, отражение, наложение текста и фигур, применение цветовых матриц, фильтров (размытие, резкость, сепия, чёрно-белое), работу с EXIF-данными, анимацию GIF и многое другое. ImageSharp построена на концепции Image как контейнера для пиксельных данных и предоставляет гибкий API через методы расширения.
2. Установка
Установка ImageSharp в проект .NET выполняется через менеджер пакетов NuGet. Выполните одну из следующих команд в терминале или консоли диспетчера пакетов:
// Через .NET CLI (рекомендуется)
dotnet add package SixLabors.ImageSharp
// Через Package Manager Console
Install-Package SixLabors.ImageSharp
// Через NuGet Package Manager в Visual Studio/Rider
// Ищите "SixLabors.ImageSharp" и установите последнюю стабильную версию
После установки добавьте директиву using в начало вашего файла:
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Processing;
using SixLabors.ImageSharp.Formats.Jpeg;
using SixLabors.ImageSharp.PixelFormats;
Rgba32 (красный, зелёный, синий, альфа-канал). Для чёрно-белых изображений можно использовать L8 или L16.3. Быстрый старт — минимальный рабочий пример
Первый пример: загружаем изображение, изменяем его размер до 300x300 пикселей и сохраняем в формате JPEG с качеством 75%.
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Processing;
using SixLabors.ImageSharp.Formats.Jpeg;
string inputPath = "input.jpg";
string outputPath = "output_resized.jpg";
using (Image image = Image.Load(inputPath))
{
// Изменяем размер, сохраняя пропорции
image.Mutate(x => x.Resize(300, 300));
// Сохраняем с настройками качества
var encoder = new JpegEncoder { Quality = 75 };
image.Save(outputPath, encoder);
}
Console.WriteLine("Изображение успешно обработано!");
Этот код загружает изображение, применяет мутацию (изменение размера) и сохраняет результат. Обратите внимание на использование using — ImageSharp реализует IDisposable для освобождения ресурсов.
4. Основные методы и классы
Ниже представлены ключевые методы и классы ImageSharp с сигнатурами, описанием и примерами кода.
4.1. Image.Load()
Сигнатура: public static Image<TPixel> Load<TPixel>(string path) where TPixel : unmanaged, IPixel<TPixel>
Что делает: Загружает изображение из файла по указанному пути. Возвращает объект Image<TPixel>, где TPixel — тип пикселя (обычно Rgba32).
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;
// Загрузка с явным указанием типа пикселя
using (Image<Rgba32> image = Image.Load<Rgba32>("photo.jpg"))
{
Console.WriteLine($"Размер: {image.Width}x{image.Height}");
}
// Загрузка без указания типа (автоматически Rgba32)
using (Image image = Image.Load("photo.jpg"))
{
Console.WriteLine($"Формат: {image.Metadata.DecodedImageFormat?.Name}");
}
4.2. Image.Save()
Сигнатура: public void Save(string path, IImageEncoder encoder = null)
Что делает: Сохраняет изображение в файл. Можно указать кодировщик для управления качеством и форматом. Если кодировщик не указан, формат определяется по расширению файла.
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Formats.Png;
using SixLabors.ImageSharp.Formats.Webp;
using (Image image = Image.Load("input.jpg"))
{
// Сохранение в PNG
image.Save("output.png");
// Сохранение в WebP с настройками
var webpEncoder = new WebpEncoder { Quality = 80, FileFormat = WebpFileFormatType.Lossy };
image.Save("output.webp", webpEncoder);
}
4.3. Mutate()
Сигнатура: public IImageProcessingContext Mutate(Func<IImageProcessingContext, IImageProcessingContext> operation)
Что делает: Применяет цепочку операций обработки к изображению (изменение размера, обрезка, фильтры и т.д.). Это основной метод для модификации изображения.
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Processing;
using (Image image = Image.Load("input.jpg"))
{
image.Mutate(ctx => ctx
.Resize(800, 600)
.Grayscale()
.Rotate(45));
image.Save("output_modified.jpg");
}
4.4. Resize()
Сигнатура: public static IImageProcessingContext Resize(this IImageProcessingContext source, int width, int height, ResizeOptions options = null)
Что делает: Изменяет размер изображения. Можно задать режим изменения (сохранение пропорций, обрезка, растяжение) через ResizeOptions.
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Processing;
using (Image image = Image.Load("input.jpg"))
{
// Изменение размера с сохранением пропорций (Pad)
image.Mutate(x => x.Resize(new ResizeOptions
{
Size = new Size(200, 200),
Mode = ResizeMode.Pad, // Добавляет фон, если пропорции не совпадают
PadColor = Color.White
}));
image.Save("output_pad.jpg");
}
4.5. Crop()
Сигнатура: public static IImageProcessingContext Crop(this IImageProcessingContext source, Rectangle rectangle)
Что делает: Обрезает изображение до указанной прямоугольной области.
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Processing;
using (Image image = Image.Load("input.jpg"))
{
// Обрезка центральной части 300x300
int x = (image.Width - 300) / 2;
int y = (image.Height - 300) / 2;
image.Mutate(ctx => ctx.Crop(new Rectangle(x, y, 300, 300)));
image.Save("output_cropped.jpg");
}
4.6. Grayscale()
Сигнатура: public static IImageProcessingContext Grayscale(this IImageProcessingContext source)
Что делает: Преобразует изображение в оттенки серого (чёрно-белое).
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Processing;
using (Image image = Image.Load("input.jpg"))
{
image.Mutate(x => x.Grayscale());
image.Save("output_grayscale.jpg");
}
4.7. Rotate() и RotateFlip()
Сигнатура: public static IImageProcessingContext Rotate(this IImageProcessingContext source, float degrees)
public static IImageProcessingContext RotateFlip(this IImageProcessingContext source, RotateMode rotateMode, FlipMode flipMode)
Что делает: Поворачивает изображение на заданный угол (в градусах) или выполняет комбинированное поворот/отражение.
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Processing;
using (Image image = Image.Load("input.jpg"))
{
// Поворот на 90 градусов
image.Mutate(x => x.Rotate(90));
image.Save("output_rotated.jpg");
// Поворот на 180 и отражение по горизонтали
image.Mutate(x => x.RotateFlip(RotateMode.Rotate180, FlipMode.Horizontal));
image.Save("output_flip.jpg");
}
4.8. DrawText()
Сигнатура: public static IImageProcessingContext DrawText(this IImageProcessingContext source, string text, Font font, Brush brush, PointF point, TextGraphicsOptions options = null)
Что делает: Рисует текст на изображении. Требует установки дополнительного пакета SixLabors.Fonts.
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Processing;
using SixLabors.Fonts;
using SixLabors.ImageSharp.Drawing.Processing;
// Установите пакет: dotnet add package SixLabors.Fonts
using (Image image = Image.Load("input.jpg"))
{
FontFamily fontFamily = SystemFonts.Get("Arial");
Font font = new Font(fontFamily, 48, FontStyle.Bold);
image.Mutate(ctx => ctx.DrawText(
"Hello, ImageSharp!",
font,
Color.Red,
new PointF(50, 50)));
image.Save("output_text.jpg");
}
4.9. Clone()
Сигнатура: public Image<TPixel> Clone<TPixel>(Func<IImageProcessingContext, IImageProcessingContext> operation)
Что делает: Создаёт новое изображение, применяя к нему операции обработки, оставляя оригинал неизменным. Полезно для создания нескольких версий изображения.
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Processing;
using (Image original = Image.Load("input.jpg"))
{
// Создаём миниатюру, не изменяя оригинал
using (Image thumbnail = original.Clone(ctx => ctx.Resize(150, 150)))
{
thumbnail.Save("thumbnail.jpg");