Trabajo con imágenes en Go (Golang): bibliotecas y ejemplos

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

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/imaging


Ejemplo 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/resize


Ejemplo 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.

Recommendations