Trabalhando com imagens em C# (.NET): do básico às técnicas avançadas
O processamento de imagens é uma das tarefas essenciais no desenvolvimento moderno. No ecossistema C# (.NET), existem várias bibliotecas poderosas para trabalhar com gráficos, desde a embutida System.Drawing até soluções modernas e multiplataforma, como ImageSharp e SkiaSharp. Neste artigo, abordaremos detalhadamente as principais abordagens, forneceremos exemplos de código e daremos recomendações práticas.
1. Visão geral das bibliotecas para trabalhar com imagens no .NET
A escolha da biblioteca depende das suas tarefas e plataforma. Aqui estão três opções principais:
- System.Drawing.Common — biblioteca clássica da Microsoft, disponível no .NET 6+. Funciona via GDI+ no Windows, mas tem limitações no Linux/macOS.
- SixLabors.ImageSharp — biblioteca totalmente gerenciada e multiplataforma. Suporta os formatos JPEG, PNG, BMP, GIF, WebP. Ideal para aplicações web e processamento no servidor.
- SkiaSharp — wrapper sobre o motor Skia (usado no Chrome, Flutter). Oferece alto desempenho e amplas capacidades para gráficos 2D, incluindo trabalho com imagens, texto e gráficos vetoriais.
Para a maioria dos projetos modernos, recomenda-se o ImageSharp — é fácil de usar, ativamente desenvolvido e independente de plataforma.
2. Instalação e configuração das bibliotecas
Instalação via NuGet Package Manager (ou .NET CLI):
// Para ImageSharpdotnet add package SixLabors.ImageSharp
// Para SkiaSharpdotnet add package SkiaSharp
// Para System.Drawing (se necessário)dotnet add package System.Drawing.Common3. Operações básicas com imagens usando ImageSharp
Vamos considerar as operações principais: carregamento, redimensionamento, corte, aplicação de filtros e salvamento.
3.1 Carregamento e exibição de informações
using SixLabors.ImageSharp;using SixLabors.ImageSharp.PixelFormats;
using (Image<Rgba32> image = Image.Load<Rgba32>("input.jpg")){ Console.WriteLine($"Largura: {image.Width}, Altura: {image.Height}"); Console.WriteLine($"Formato de pixel: {image.PixelType}");}3.2 Redimensionamento mantendo a proporção
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 Corte (crop) da parte central
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 Aplicação de filtros (preto e branco, desfoque)
using SixLabors.ImageSharp.Processing;using SixLabors.ImageSharp.Processing.Processors.Transforms;
using (Image<Rgba32> image = Image.Load<Rgba32>("input.jpg")){ // Filtro preto e branco image.Mutate(x => x.Grayscale());
// Desfoque Gaussiano (raio 5) image.Mutate(x => x.GaussianBlur(5));
image.Save("output_filtered.jpg");}4. Trabalhando com formatos e qualidade
O ImageSharp permite definir parâmetros de salvamento para cada formato:
using SixLabors.ImageSharp.Formats.Jpeg;
using (Image<Rgba32> image = Image.Load<Rgba32>("input.jpg")){ var encoder = new J