Trabajo con imágenes en Go: cambio de tamaño (resize) y recorte (crop)
\n\nEn el desarrollo web moderno y la creación de servicios backend, a menudo surge la necesidad de procesar archivos gráficos: reducir el peso, unificar formatos, crear miniaturas. El lenguaje Go (Golang) ofrece varias bibliotecas potentes y eficientes para trabajar con imágenes. En este artículo, analizaremos en detalle dos operaciones clave: cambio de tamaño (resize) y recorte (crop), utilizando herramientas populares.
\n\n¿Por qué Go para el procesamiento de imágenes?
\nGo se compila a código nativo, tiene un alto rendimiento y soporte integrado para subprocesos múltiples. Esto lo convierte en una excelente opción para crear servicios de procesamiento de imágenes de alta carga. A diferencia de Python, donde a menudo se usa Pillow (extensiones C), Go proporciona implementaciones Go puras que se integran fácilmente en una arquitectura de microservicios.
\n\nBibliotecas principales
\n- \n
github.com/disintegration/imaging— la biblioteca más popular. Proporciona una API conveniente para resize, crop, rotate, blur y otras operaciones. Funciona sobre el paquete estándarimage. \n github.com/nfnt/resize— una de las primeras bibliotecas. Se caracteriza por su alta velocidad y soporte para varios algoritmos de interpolación (NearestNeighbor, Bilinear, Lanczos2, Lanczos3). \n github.com/anthonynsimon/bild— un proyecto más nuevo con enfoque en el rendimiento y la limpieza del código. Soporta resize, crop, efectos. \n
En este artículo, nos centraremos en la biblioteca imaging por ser la más equilibrada en funcionalidad y facilidad de uso.
Instalación
\nPara empezar, es necesario instalar la biblioteca usando go get:
go get github.com/disintegration/imaging\n\nCambio de tamaño de imagen (Resize)
\nLa operación resize permite escalar la imagen a nuevas dimensiones. La biblioteca imaging soporta varios modos:
- \n
- Fit — ajusta la imagen dentro de un rectángulo dado, manteniendo la proporción. \n
- Fill — llena el rectángulo, recortando los bordes si es necesario. \n
- Resize — cambio de tamaño exacto al ancho y alto especificados (sin mantener la proporción). \n
Ejemplo de cambio de tamaño básico manteniendo la proporción (Fit):
\npackage main\n\nimport (\n "github.com/disintegration/imaging"\n "log"\n)\n\nfunc main() {\n // Abrimos la imagen original\n src, err := imaging.Open("input.jpg")\n if err != nil {\n log.Fatalf("Error al abrir: %v", err)\n }\n\n // Cambiamos el tamaño a un ancho de 800px, la altura se calcula automáticamente\n dst := imaging.Fit(src, 800, 600, imaging.Lanczos)\n\n // Guardamos el resultado\n err = imaging.Save(dst, "output_fit.jpg")\n if err != nil {\n log.Fatalf("Error al guardar: %v", err)\n }\n log.Println("¡Imagen procesada exitosamente!")\n}\n\nSi necesita un cambio de tamaño exacto (por ejemplo, para crear una vista previa de 150x150):
\n// Cambio de tamaño exacto (puede distorsionar la proporción)\ndst := imaging.Resize(src, 150, 150, imaging.Lanczos)\n\nRecorte de imagen (Crop)
\nEl recorte permite eliminar una parte de la imagen. En imaging hay dos métodos principales:
- \n
Crop— recorta un área rectangular según las coordenadas dadas. \n CropCenter— recorta el área central de un tamaño dado. \n
Ejemplo de recorte de la parte central (útil para crear avatares cuadrados):
\npackage main\n\nimport (\n "github.com/disintegration/imaging"\n "log"\n)\n\nfunc main() {\n src, err : También en la biblioteca
TBB (Intel Threading Building Blocks) para C++: guía completa con ejemplos
Effect-ts para TypeScript: guía completa con ejemplos
ts-pattern en TypeScript: guía completa con ejemplos
Paging 3 para Kotlin: guía completa con ejemplos prácticos
Trabajo con Excel en PHP: bibliotecas PhpSpreadsheet y OpenSpout