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

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

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

Начать курс

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

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

1. Стандартная библиотека: System.Drawing.Common

Исторически первой и самой известной является System.Drawing.Common. Она предоставляет доступ к GDI+ (Graphics Device Interface) Windows. Однако у неё есть важные ограничения:

  • Работает только на Windows (для .NET Core/.NET 5+ требуется пакет System.Drawing.Common, но на Linux/macOS поддержка ограничена).
  • Не оптимизирована для высоконагруженных веб-сервисов (утечки памяти при неправильном использовании).
  • Не поддерживает современные форматы (WebP, AVIF) "из коробки".

Пример загрузки и изменения размера изображения:

using System.Drawing;
using System.Drawing.Imaging;

public static void ResizeImage(string sourcePath, string destPath, int newWidth, int newHeight)
{
    using (var image = Image.FromFile(sourcePath))
    using (var resized = new Bitmap(newWidth, newHeight))
    using (var graphics = Graphics.FromImage(resized))
    {
        graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
        graphics.DrawImage(image, 0, 0, newWidth, newHeight);
        resized.Save(destPath, ImageFormat.Jpeg);
    }
}

Этот код загружает исходное изображение, создаёт новый Bitmap с заданными размерами и рисует на нём исходник с высоким качеством. Подходит для простых задач.

2. Современная кросс-платформенная библиотека: ImageSharp (SixLabors)

ImageSharp — это полностью управляемая библиотека для .NET, не зависящая от GDI+. Она работает на Windows, Linux и macOS. Основные преимущества:

  • Чистый C# код, без нативных зависимостей.
  • Поддержка WebP, PNG, JPEG, BMP, GIF, TIFF.
  • Встроенные фильтры, повороты, обрезка, изменение размера.
  • Высокая производительность и безопасность для веб-приложений.

Установка: dotnet add package SixLabors.ImageSharp

Пример изменения размера и сохранения в WebP:

using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Processing;
using SixLabors.ImageSharp.Formats.Webp;

public static void ResizeToWebp(string input, string output, int width, int height)
{
    using (var image = Image.Load(input))
    {
        image.Mutate(x => x.Resize(width, height));
        var encoder = new WebpEncoder { Quality = 80 };
        image.Save(output, encoder);
    }
}

Обратите внимание: метод Mutate применяет изменения к самому изображению (без создания копии), что экономит память.

3. Графический движок: SkiaSharp

SkiaSharp — это обёртка над библиотекой Skia (используется в Chrome, Android, Flutter). Она предоставляет максимальную гибкость и производительность, особенно для сложной 2D-графики.

  • Кроссплатформенность (Windows, Linux, macOS, мобильные платформы).
  • Поддержка аппаратного ускорения (GPU).
  • Богатый набор инструментов: пути, кисти, шейдеры, маски.

Пример наложения водяного знака:

using SkiaSharp;

public static void AddWatermark(string imagePath, string watermarkText, string outputPath)
{
    using (var input = SKBitmap.Decode(imagePath))
    using (var canvas = new SKCanvas(input))
    using (var paint = new SKPaint
    {
        Color = SKColors.White.WithAlpha(128),
        TextSize = 48,
        IsAntialias = true,
        Typeface = SKTypeface.FromFamilyName("Arial")
    })
    {
        canvas.DrawText(watermarkText, 20, input.Height - 30, paint);
        using (var image = SKImage.FromBitmap(input))
        using (var data = image.Encode(SKEncodedImageFormat.Png, 100))
        {
            File.WriteAllBytes(outputPath, data.ToArray());
        }
    }
}

SkiaSharp идеален, если вам нужно рисовать сложные фигуры, работать с прозрачностью или использовать шейдеры.

4. Сравнение библиотек

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