ImageSharp для C# (.NET): полное руководство с примерами

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

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

Начать курс
ImageSharp C# (.NET): методы, примеры, установка | PythonLib

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;
Примечание: ImageSharp использует дженерики для работы с пиксельными форматами. Наиболее распространённый — 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");                    

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