Procesamiento de imágenes en Go: cambio de tamaño y recorte (resize, crop)

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Trabajo con imágenes en Go: cambio de tamaño (resize) y recorte (crop)

\n\n

En 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?

\n

Go 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\n

Bibliotecas 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ándar image.
  • \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
\n\n

En este artículo, nos centraremos en la biblioteca imaging por ser la más equilibrada en funcionalidad y facilidad de uso.

\n\n

Instalación

\n

Para empezar, es necesario instalar la biblioteca usando go get:

\n
go get github.com/disintegration/imaging
\n\n

Cambio de tamaño de imagen (Resize)

\n

La operación resize permite escalar la imagen a nuevas dimensiones. La biblioteca imaging soporta varios modos:

\n
    \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
\n\n

Ejemplo de cambio de tamaño básico manteniendo la proporción (Fit):

\n
package 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\n

Si 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\n

Recorte de imagen (Crop)

\n

El recorte permite eliminar una parte de la imagen. En imaging hay dos métodos principales:

\n
    \n
  • Crop — recorta un área rectangular según las coordenadas dadas.
  • \n
  • CropCenter — recorta el área central de un tamaño dado.
  • \n
\n\n

Ejemplo de recorte de la parte central (útil para crear avatares cuadrados):

\n
package main\n\nimport (\n    "github.com/disintegration/imaging"\n    "log"\n)\n\nfunc main() {\n    src, err :                    

Recommendations