imagesharp

Cómo trabajar con imágenes en C# con ImageSharp

ImageSharp es una popular biblioteca de código abierto para el procesado de imágenes en .NET, que se ha convertido en casi un estándar para el tratamiento de imágenes en aplicaciones con C#.

Incluye soporte para la mayoría de los formatos de imágenes populares, y proporciona funcionalidades de manipulación y edición avanzada, así como conversión de formato entre imágenes.

Algunas de sus características son:

  • Manipulación de imágenes básica: Cambio de tamaño, rotación, recorte, etc.
  • Procesamiento de imágenes avanzado: Sombreado, filtro de color, cambio de tono, etc.
  • Soporte para una amplia variedad de formatos de imagen, incluyendo JPEG, PNG, BMP, GIF, WebP, SVG, y más.
  • Compatibilidad con .NET Standard 2.0, .NET Core y .NET Framework.

Como usar ImageSharp

Podemos agregar fácilmente XamlFlair a nuestro proyecto a través de un paquete NuGet haciendo,

Install-Package SixLabors.ImageSharp

Para cargar una imagen WebP en nuestro código de C# llamamos al método Load de la clase Image con la ruta de la imagen a cargar.

using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Processing;

// Cargar imagen desde archivo
using (var imagen = Image.Load("ruta_a_la_imgen.webp"))
{
    // Cambiar el tamaño de la imagen
    imagen.Mutate(x => x.Resize(new Size(800, 600)));

	// Guardar la imagen modificada
    imagen.Save("ruta_a_la_imagen_modificada.webp");
}

A continuación podemos aplicar transformaciones a la imagen mediante el método ‘Mutate’, y pasando las transformaciones a realizar.

Hay un montón de transformaciones que podemos aplicar incluidos, desde los más básicos como resize, crop, rotate, contrast, brightness, a más avanzados como ajuste de color, o detección de contornos.

A continuación, podemos guardar la imagen en cualquiera de los formatos disponibles mediante el método ‘Save’.

Opcionalmente, podemos cambiar los parámetros del encoder. Por ejemplo, para cambiar la calidad de un fichero wepb haríamos

using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Processing;

// Cargar imagen desde archivo
using (var imagen = Image.Load("ruta_a_la_imgen.webp"))
{
    // Cambiar el tamaño de la imagen
    imagen.Mutate(x => x.Resize(new Size(800, 600)));

    var encoder = new WebpEncoder()
    {
        Quality = 70
    };
    
	// Guardar la imagen modificada
    imagen.Save("ruta_a_la_imagen_modificada.webp", encoder);
}

Conviertiendo a drawing image

Si queremos usar las imágenes de ImageSharp en una aplicación de C#, por ejemplo en una aplicación de WinForms o WPF, deberemos convertirla a un formato de Drawings.Common.

Con estos dos métodos de extensión

public static byte[] ToArray(this SixLabors.ImageSharp.Image imageIn)
{
	using (MemoryStream ms = new MemoryStream())
	{
		imageIn.Save(ms, PngFormat.Instance);
		return ms.ToArray();
	}
}

public static System.Drawing.Image ToDrawingImage(this byte[] byteArrayIn)
{
	using (MemoryStream ms = new MemoryStream(byteArrayIn))
	{
		System.Drawing.Image returnImage = System.Drawing.Image.FromStream(ms);
		return returnImage;
	}
}

Con esto podemos convertir nuestra imagen de ImageSharp de esta forma

var drawingImage = imagen.ToArray().ToDrawingImage();

Si necesitamos un Drawing.Bitmap, podemos hacer lo siguiente

var drawingImage = imagen.ToArray().ToDrawingImage();
var bitmap = new System.Drawing.Bitmap(drawingImage);

Con esto ya podríamos meter la imagen, por ejemplo, en un PictureBox o en cualquier otro control estándar de Windows que muestre imágenes.

En este ejemplo, estamos creando un nuevo control PictureBox y asignando el objeto Image cargado al control. Además, estamos configurando la propiedad SizeMode del control en StretchImage, que hace que la imagen se ajuste automáticamente al tamaño del control.

En definitiva, ImageSharp es una librería muy potente para tratamiento de imágenes y, salvo casos muy especiales, es casi la única librería que vais a necesitar para trabajar con imágenes en .NET.

De hecho, esta biblioteca está recomendada por la propia Microsoft como una de las alternativas para trabajar con imágenes, frente al “lio” que tienen con sus propias librerías.

Por supuesto, hay muchas más opciones y funciones disponibles. Si os interesa, en la página web del proyecto proporcionan documentación y ejemplos de uso.