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

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

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

Начать курс

Работа с изображениями в C# (.NET): от основ до продвинутых техник

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

1. Обзор библиотек для работы с изображениями в .NET

Выбор библиотеки зависит от ваших задач и платформы. Вот три основных варианта:

  • System.Drawing.Common — классическая библиотека от Microsoft, доступная в .NET 6+. Работает через GDI+ на Windows, но имеет ограничения на Linux/macOS.
  • SixLabors.ImageSharp — полностью управляемая, кросс-платформенная библиотека. Поддерживает форматы JPEG, PNG, BMP, GIF, WebP. Отлично подходит для веб-приложений и серверной обработки.
  • SkiaSharp — обёртка над движком Skia (используется в Chrome, Flutter). Предоставляет высокую производительность и широкие возможности для 2D-графики, включая работу с изображениями, текстом и векторной графикой.

Для большинства современных проектов рекомендуется ImageSharp — он прост в использовании, активно развивается и не зависит от платформы.

2. Установка и подключение библиотек

Установка через NuGet Package Manager (или .NET CLI):

// Для ImageSharp
dotnet add package SixLabors.ImageSharp

// Для SkiaSharp
dotnet add package SkiaSharp

// Для System.Drawing (если нужно)
dotnet add package System.Drawing.Common

3. Базовые операции с изображениями на примере ImageSharp

Рассмотрим основные операции: загрузка, изменение размера, обрезка, применение фильтров и сохранение.

3.1 Загрузка и отображение информации

using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;

using (Image<Rgba32> image = Image.Load<Rgba32>("input.jpg"))
{
    Console.WriteLine($"Ширина: {image.Width}, Высота: {image.Height}");
    Console.WriteLine($"Формат пикселей: {image.PixelType}");
}

3.2 Изменение размера с сохранением пропорций

using SixLabors.ImageSharp.Processing;

using (Image<Rgba32> image = Image.Load<Rgba32>("input.jpg"))
{
    int newWidth = 800;
    int newHeight = (int)((float)image.Height / image.Width * newWidth);

    image.Mutate(x => x.Resize(newWidth, newHeight));
    image.Save("output_resized.jpg");
}

3.3 Обрезка (crop) центральной части

using (Image<Rgba32> image = Image.Load<Rgba32>("input.jpg"))
{
    int cropSize = Math.Min(image.Width, image.Height);
    var rect = new Rectangle(
        (image.Width - cropSize) / 2,
        (image.Height - cropSize) / 2,
        cropSize,
        cropSize
    );

    image.Mutate(x => x.Crop(rect));
    image.Save("output_cropped.jpg");
}

3.4 Применение фильтров (чёрно-белый, размытие)

using SixLabors.ImageSharp.Processing;
using SixLabors.ImageSharp.Processing.Processors.Transforms;

using (Image<Rgba32> image = Image.Load<Rgba32>("input.jpg"))
{
    // Чёрно-белый фильтр
    image.Mutate(x => x.Grayscale());

    // Размытие по Гауссу (радиус 5)
    image.Mutate(x => x.GaussianBlur(5));

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

4. Работа с форматами и качеством

ImageSharp позволяет задавать параметры сохранения для каждого формата:

using SixLabors.ImageSharp.Formats.Jpeg;

using (Image<Rgba32> image = Image.Load<Rgba32>("input.jpg"))
{
    var encoder = new JpegEncoder
    {
        Quality = 75, // Качество от 1 до 100
        Subsample = JpegSubsample.Ratio420
    };

    image.Save("output_compressed.jpg", encoder);
}

5. Продвинутые возможности: SkiaSharp для сложной графики

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

using SkiaSharp;

using (var input = SKBitmap.Decode("input.jpg"))
using (var canvas = new SKCanvas(input))
{
    var paint = new SKPaint
    {
        Color = SKColors.White,
        TextSize =                    

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