Работа с изображениями в C# (.NET): обзор библиотек и практические примеры
Обработка изображений — одна из ключевых задач при создании современных веб-приложений, десктопных программ и мобильных сервисов. В экосистеме C# (.NET) существует несколько мощных библиотек, позволяющих загружать, редактировать, анализировать и сохранять изображения. В этой статье мы разберём основные подходы: от классической System.Drawing до современных кроссплатформенных решений ImageSharp и SkiaSharp.
1. System.Drawing.Common — классика .NET
Библиотека System.Drawing.Common доступна в .NET Core/.NET 5+ как NuGet-пакет. Она предоставляет знакомый API для работы с растровыми изображениями (BMP, JPEG, PNG, GIF, TIFF).
Важно: на Linux и macOS требует установки библиотеки libgdiplus.
Установка
dotnet add package System.Drawing.Common
Пример: загрузка, изменение размера и сохранение
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
public class ImageProcessor
{
public void ResizeImage(string inputPath, string outputPath, int maxWidth, int maxHeight)
{
using var original = Image.FromFile(inputPath);
var ratio = Math.Min((double)maxWidth / original.Width, (double)maxHeight / original.Height);
int newWidth = (int)(original.Width * ratio);
int newHeight = (int)(original.Height * ratio);
using var bitmap = new Bitmap(newWidth, newHeight);
using var graphics = Graphics.FromImage(bitmap);
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.DrawImage(original, 0, 0, newWidth, newHeight);
bitmap.Save(outputPath, ImageFormat.Jpeg);
}
}
2. ImageSharp (SixLabors) — современная кроссплатформенная библиотека
SixLabors.ImageSharp — чистая управляемая библиотека без зависимостей от нативных компонентов. Идеально подходит для серверных приложений, веб-сервисов и облачных функций. Поддерживает расширенные форматы (WebP, HEIF, AVIF) и продвинутую обработку.
Установка
dotnet add package SixLabors.ImageSharp
Пример: наложение водяного знака
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Drawing.Processing;
using SixLabors.ImageSharp.Processing;
using SixLabors.Fonts;
public async Task AddWatermarkAsync(string inputPath, string outputPath, string watermarkText)
{
using var image = await Image.LoadAsync(inputPath);
var font = SystemFonts.CreateFont("Arial", 48, FontStyle.Bold);
image.Mutate(ctx =>
{
ctx.DrawText(watermarkText, font, Color.White, new PointF(50, 50));
});
await image.SaveAsync(outputPath);
}
3. SkiaSharp — графический движок от Google
SkiaSharp — обёртка над библиотекой Skia (используется в Chrome, Flutter, Android). Обеспечивает высокую производительность, низкоуровневый доступ к пикселям и поддержку сложных векторных преобразований.
Установка
dotnet add package SkiaSharp
Пример: применение фильтра размытия (Blur)
using SkiaSharp;
public void ApplyBlur(string inputPath, string outputPath, float sigma)
{
using var inputStream = File.OpenRead(inputPath);
using var original = SKBitmap.Decode(inputStream);
using var surface = new SKCanvas(original);
var paint = new SKPaint
{
ImageFilter = SKImageFilter.CreateBlur(sigma, sigma)
};
surface.DrawBitmap(original, 0, 0, paint);
using var image = SKImage.FromBitmap(original);
using var data = image.Encode(SKEncodedImageFormat.Jpeg, 90);
using var outputStream = File.OpenWrite(outputPath);
data.SaveTo(outputStream);
}
4. Дополнительные возможности и сравнение
- System.Drawing — подходит для быстрой миграции старых проектов, но ограничен в кроссплатформенности.
- ImageSharp — рекомендуется для новых проектов: безопасная работа с памятью, поддержка async/await, встроенная обработка метаданных.
- SkiaSharp — выбор для высоконагруженных систем, где нужен полный контроль над рендерингом (например, генерация сложных графиков или PDF).
5. Практический пример: конвертация форматов с оптимизацией
Ниже представлен универсальный метод, который использует ImageSharp для конвертации изображения в WebP с настройкой качества:
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Formats