Trabajo con imágenes en C# (.NET): desde lo básico hasta técnicas avanzadas
El procesamiento de imágenes es una de las tareas clave en el desarrollo moderno. En el ecosistema C# (.NET), existen varias bibliotecas potentes para trabajar con gráficos, desde el integrado System.Drawing hasta soluciones multiplataforma modernas como ImageSharp y SkiaSharp. En este artículo, analizaremos en detalle los enfoques principales, proporcionaremos ejemplos de código y daremos recomendaciones prácticas.
1. Resumen de bibliotecas para trabajar con imágenes en .NET
La elección de la biblioteca depende de sus tareas y plataforma. Aquí hay tres opciones principales:
- System.Drawing.Common — la biblioteca clásica de Microsoft, disponible en .NET 6+. Funciona a través de GDI+ en Windows, pero tiene limitaciones en Linux/macOS.
- SixLabors.ImageSharp — una biblioteca completamente administrada y multiplataforma. Admite formatos JPEG, PNG, BMP, GIF, WebP. Ideal para aplicaciones web y procesamiento del lado del servidor.
- SkiaSharp — un envoltorio sobre el motor Skia (utilizado en Chrome, Flutter). Proporciona alto rendimiento y amplias capacidades para gráficos 2D, incluyendo trabajo con imágenes, texto y gráficos vectoriales.
Para la mayoría de los proyectos modernos, se recomienda ImageSharp — es fácil de usar, se desarrolla activamente y no depende de la plataforma.
2. Instalación y configuración de las bibliotecas
Instalación a través del Administrador de paquetes NuGet (o .NET CLI):
// Para ImageSharpdotnet add package SixLabors.ImageSharp
// Para SkiaSharpdotnet add package SkiaSharp
// Para System.Drawing (si es necesario)dotnet add package System.Drawing.Common3. Operaciones básicas con imágenes usando ImageSharp como ejemplo
Veamos las operaciones principales: carga, cambio de tamaño, recorte, aplicación de filtros y guardado.
3.1 Carga y visualización de información
using SixLabors.ImageSharp;using SixLabors.ImageSharp.PixelFormats;
using (Image<Rgba32> image = Image.Load<Rgba32>("input.jpg")){ Console.WriteLine($"Ancho: {image.Width}, Alto: {image.Height}"); Console.WriteLine($"Formato de píxeles: {image.PixelType}");}3.2 Cambio de tamaño manteniendo la proporción
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 Recorte (crop) de la 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 Aplicación de filtros (blanco y negro, desenfoque)
using SixLabors.ImageSharp.Processing;using SixLabors.ImageSharp.Processing.Processors.Transforms;
using (Image<Rgba32> image = Image.Load<Rgba32>("input.jpg")){ // Filtro blanco y negro image.Mutate(x => x.Grayscale());
// Desenfoque gaussiano (radio 5) image.Mutate(x => x.GaussianBlur(5));
image.Save("output_filtered.jpg");}4. Trabajo con formatos y calidad
ImageSharp permite establecer parámetros de guardado para cada formato:
using SixLabors.ImageSharp.Formats.Jpeg;
using (Image<Rgba32> image = Image.Load<Rgba32>("input.jpg")){ var encoder = new J