Работа с изображениями в 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 идеален, если вам нужно рисовать сложные фигуры, работать с прозрачностью или использовать шейдеры.