Introducción al trabajo con imágenes en Go
Go (Golang) es un lenguaje compilado moderno con una rica biblioteca estándar que incluye el paquete image para el trabajo básico con imágenes rasterizadas. Sin embargo, para tareas de escalado, filtrado, conversión de formatos y procesamiento por lotes, a menudo se requieren bibliotecas de terceros. En este artículo, revisaremos las herramientas más populares para trabajar con imágenes en Go, proporcionaremos ejemplos de código y compararemos sus capacidades.
El paquete estándar image
El paquete image de la biblioteca estándar de Go proporciona tipos y funciones básicas para decodificar, codificar y manipular imágenes. Soporta los formatos PNG, JPEG y GIF (solo decodificación). Ejemplo de carga de una imagen desde un archivo:
package main
import ( "image" "image/jpeg" "os")
func main() { file, err := os.Open("input.jpg") if err != nil { panic(err) } defer file.Close()
img, _, err := image.Decode(file) if err != nil { panic(err) }
// Acceso a píxeles a través de img.At(x, y) _ = img}Limitaciones del paquete estándar: falta de funciones integradas para cambiar tamaño, rotar, filtrar y trabajar con datos EXIF. Para estas tareas, use bibliotecas de terceros.
Biblioteca imaging
imaging es una de las bibliotecas más populares para el procesamiento de imágenes en Go. Proporciona una API simple para cambiar tamaño, recortar, rotar, aplicar filtros y convertir formatos.
Instalación:
go get github.com/disintegration/imagingEjemplo de cambio de tamaño manteniendo la proporción:
package main
import ( "github.com/disintegration/imaging" "log")
func main() { src, err := imaging.Open("input.jpg") if err != nil { log.Fatalf("Error al abrir: %v", err) }
// Cambiar tamaño a un ancho de 800px, la altura se ajusta dst := imaging.Resize(src, 800, 0, imaging.Lanczos)
err = imaging.Save(dst, "output.jpg") if err != nil { log.Fatalf("Error al guardar: %v", err) }}La biblioteca soporta filtros: desenfoque, nitidez, contraste, brillo, escala de grises. Ejemplo de aplicación de filtro:
grayscaleImg := imaging.Grayscale(src)sharpImg := imaging.Sharpen(src, 0.5)blurImg := imaging.Blur(src, 3.0)Ventajas: API limpia, soporte para GIF (solo lectura), orientación automática según EXIF, funciones integradas para miniaturas y procesamiento por lotes.
Biblioteca nfnt/resize
nfnt/resize es una biblioteca especializada para cambiar el tamaño de imágenes. Ofrece varios algoritmos de interpolación (NearestNeighbor, Bilinear, Bicubic, MitchellNetravali, Lanczos2, Lanczos3).
Instalación:
go get github.com/nfnt/resizeEjemplo de cambio de tamaño a exactamente 200x200 píxeles:
package main
import ( "image/jpeg" "os" "github.com/nfnt/resize")
func main() { file, _ := os.Open("input.jpg") defer file.Close() img, _ := jpeg.Decode(file)
// Cambiar tamaño a 200x200 newImg := resize.Resize(200, 200, img, resize.Lanczos3)
out, _ := os.Create("resized.jpg") defer out.Close() jpeg.Encode(out, newImg, nil)}Características: la biblioteca solo funciona con imágenes que implementan la interfaz image.Image. No soporta la lectura/escritura directa de archivos; se requiere decodificación/codificación manual.
También en la biblioteca
MPAndroidChart en Kotlin: guía completa con ejemplos
Trabajo con XML en C# (.NET): Guía completa para principiantes
Envío de SMS en Rust: RustSMS — Biblioteca API para trabajar con puertas de enlace SMS
ORM para Kotlin: Exposed vs Ktor vs Ktorm — comparación y ejemplos
ESLint + Plugins de TypeScript para TypeScript: guía completa con ejemplos