Работа с изображениями в 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 =