Trabajo con imágenes en Go (Golang): desde lo básico hasta herramientas avanzadas
Go (Golang) proporciona potentes herramientas integradas para trabajar con gráficos rasterizados, así como un rico ecosistema de bibliotecas de terceros. En este artículo, veremos tanto los paquetes estándar image, image/color, image/draw y image/png, como las bibliotecas populares imaging, resize y gg para resolver tareas típicas: carga, cambio de tamaño, superposición, dibujo y guardado de imágenes.
Paquetes estándar de Go para trabajar con imágenes
En la biblioteca estándar de Go se incluyen tipos y funciones básicas para trabajar con imágenes que cubren el 80% de las tareas cotidianas.
- image — define la interfaz
Imagey tipos concretos:RGBA,NRGBA,Gray,Paletted, entre otros. - image/color — describe colores y modelos de color (
Color,RGBA,NRGBA,Gray). - image/draw — proporciona algoritmos de dibujo y superposición de imágenes (composición Porter-Duff).
- image/png, image/jpeg, image/gif — códecs para leer/escribir los formatos correspondientes.
Ejemplo 1: Crear y guardar un PNG con degradado
package main
import ( "image" "image/color" "image/png" "os")
func main() { // Creamos una nueva imagen RGBA de 200x200 width, height := 200, 200 img := image.NewRGBA(image.Rect(0, 0, width, height))
// Rellenamos los píxeles con un degradado de rojo a azul for y := 0; y < height; y++ { for x := 0; x < width; x++ { // Coeficiente de 0 a 1 ratio := float64(x) / float64(width) r := uint8(255 * (1 - ratio)) b := uint8(255 * ratio) g := uint8(128) img.Set(x, y, color.RGBA{r, g, b, 255}) } }
// Guardamos en un archivo f, _ := os.Create("gradient.png") defer f.Close() png.Encode(f, img)}Ejemplo 2: Cargar un JPEG, superponer texto (mediante image/draw)
package main
import ( "image" "image/color" "image/draw" "image/jpeg" "image/png" "os")
func main() { // Abrimos la imagen original srcFile, _ := os.Open("input.jpg") defer srcFile.Close() src, _, _ := image.Decode(srcFile)
// Creamos una copia en RGBA para poder dibujar bounds := src.Bounds() dst := image.NewRGBA(bounds) draw.Draw(dst, bounds, src, bounds.Min, draw.Src)
// Dibujamos un rectángulo rojo en la esquina superior izquierda redRect := image.NewUniform(color.RGBA{255, 0, 0, 200}) rect := image.Rect(10, 10, 150, 80) draw.Draw(dst, rect, redRect, image.Point{}, draw.Over)
// Guardamos el resultado outFile, _ := os.Create("output.png") defer outFile.Close() png.Encode(outFile, dst)}Biblioteca imaging: procesamiento de alto nivel
imaging (github.com/disintegration/imaging) es una biblioteca popular que proporciona una API conveniente para las operaciones más comunes: cambio de tamaño, recorte, rotación, aplicación de filtros y conversión.
imaging.Open()— carga una imagen desde un archivo.imaging.Resize()— cambia el tamaño manteniendo la proporción.imaging.Fit()— ajusta la imagen dentro de un rectángulo dado.imaging.Fill()— recorta y escala a un tamaño exacto.imaging.Rotate()— rota la imagen un ángulo dado.imaging.Blur(),imaging.Sharpen()— filtros.