Trabajo con imágenes en C#: cambio de tamaño y recorte (resize, crop)
\n\nEn el desarrollo web moderno y las aplicaciones de escritorio, a menudo es necesario procesar imágenes mediante programación: reducirlas para acelerar la carga, crear miniaturas o recortar bordes sobrantes. En el ecosistema .NET existen varios enfoques para resolver estas tareas. En este artículo, veremos dos formas principales de cambiar el tamaño (resize) y recortar (crop) imágenes en C#: el clásico System.Drawing y el moderno multiplataforma SixLabors.ImageSharp.
1. Uso de System.Drawing (Windows Forms / .NET Framework)
\nLa forma clásica, disponible en .NET Framework y .NET Core/5+ (con limitaciones en Linux/macOS). Funciona a través del espacio de nombres System.Drawing y la clase Bitmap. Adecuado para proyectos antiguos o aplicaciones solo para Windows.
Ejemplo: cambio de tamaño manteniendo la proporción
\nusing System.Drawing;\nusing System.Drawing.Drawing2D;\nusing System.Drawing.Imaging;\n\npublic static Bitmap ResizeImage(Image image, int newWidth, int newHeight)\n{\n var destRect = new Rectangle(0, 0, newWidth, newHeight);\n var destImage = new Bitmap(newWidth, newHeight);\n\n using (var graphics = Graphics.FromImage(destImage))\n {\n graphics.CompositingMode = CompositingMode.SourceCopy;\n graphics.CompositingQuality = CompositingQuality.HighQuality;\n graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;\n graphics.SmoothingMode = SmoothingMode.HighQuality;\n graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;\n\n using (var wrapMode = new ImageAttributes())\n {\n wrapMode.SetWrapMode(WrapMode.TileFlipXY);\n graphics.DrawImage(image, destRect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, wrapMode);\n }\n }\n return destImage;\n}\n\n// Uso:\nusing (var original = Image.FromFile("input.jpg"))\n{\n using (var resized = ResizeImage(original, 800, 600))\n {\n resized.Save("output.jpg", ImageFormat.Jpeg);\n }\n}\n\nEjemplo: recorte (crop) de imagen
\npublic static Bitmap CropImage(Image source, Rectangle cropArea)\n{\n var bmp = new Bitmap(cropArea.Width, cropArea.Height);\n using (var g = Graphics.FromImage(bmp))\n {\n g.DrawImage(source, new Rectangle(0, 0, bmp.Width, bmp.Height),\n cropArea, GraphicsUnit.Pixel);\n }\n return bmp;\n}\n\n// Uso:\nvar cropRect = new Rectangle(100, 50, 300, 200); // X, Y, Width, Height\nusing (var cropped = CropImage(Image.FromFile("input.jpg"), cropRect))\n{\n cropped.Save("cropped.jpg", ImageFormat.Jpeg);\n}\n\n2. SixLabors.ImageSharp (multiplataforma .NET)
\nSixLabors.ImageSharp es una biblioteca moderna, completamente gestionada para el procesamiento de imágenes, que funciona en .NET Core, .NET 5/6/7+ y .NET Framework. No depende de la API de Windows, por lo que es ideal para aplicaciones web (ASP.NET Core), utilidades de consola y contenedores Docker.
\n\nInstalación a través de NuGet:
\ndotnet add package SixLabors.ImageSharp\n\nEjemplo: cambio de tamaño manteniendo la proporción
\nusing SixLabors.ImageSharp;\nusing SixLabors.ImageSharp.Processing;\n\npublic static void ResizeImageSharp(string inputPath, string outputPath, int width, int height)\n{\n using (var image = Image.Load(inputPath))\n {\n // Modo ResizeMode.Pad — ajusta la imagen, añadiendo bordes transparentes/blancos\n // ResizeMode.Crop — recorta al tamaño especificado\n // ResizeMode.Max — mantiene la proporción, ajustando al rectángulo\n image.Mutate(x => x.Resize(width, height, KnownResamplers.Lanczos3));\n image.Save(outputPath);\n }\n}\n\n// Ejemplo con preservación de proporciones (au También en la biblioteca
Trabajo con XML en Rust: bibliotecas roxmltree, quick-xml y serde-xml-rs
Aprendizaje automático en Kotlin: revisión de bibliotecas para Data Science y ML
Mapster para C# (.NET): guía completa con ejemplos prácticos
Configuración de aplicaciones Node.js: mejores herramientas y enfoques