Agregar texto a imagen con Golang

En este tutorial de trabajo con imágenes en Golang vamos a ver cómo escribir texto sobre una imagen, cambiado la alineación, tamaño, espaciado de línea e incluso cargando una fuente TTF.

Veamos entonces cómo dibujar texto sobre una imagen con Golang. El ejemplo que te mostraré crea una imagen en blanco y dibuja el texto en la misma, ajustando el texto como sea necesario.

Instalando Go Graphics

Si bien deben existir varias maneras de agregar texto a una imagen con Go, yo recomiendo usar la librería Go graphics cuyo repositorio está en: https://github.com/fogleman/gg

Puedes instalarlo así: go get -u github.com/fogleman/gg

Y después importarlo así:

import "github.com/fogleman/gg"

Escribir texto usando tipografía TTF

Escribir en imagen con Golang - Dibujar texto con TTF
Escribir en imagen con Golang – Dibujar texto con TTF

Veamos un primer ejemplo donde a partir de una tipografía (font face) escribimos el texto sobre una imagen. El ejemplo queda así, lo he encerrado en una función para que sea reutilizable:

func dibujarConFuenteDeUsuario(ancho, alto, tamañoFuente float64, espaciadoDeLineas float64, texto string, alineacion int, ubicacionFuente string) error {
	dc := gg.NewContext(int(ancho), int(alto))
	dc.SetRGB(1, 1, 1) // Fondo
	dc.Clear()
	dc.SetRGB(0, 0, 0) // Color del texto
	if err := dc.LoadFontFace(ubicacionFuente, tamañoFuente); err != nil {
		return err
	}
	dc.DrawStringWrapped(
		texto,
		0, 0,
		0, 0,
		ancho, espaciadoDeLineas,
		gg.Align(alineacion))
	return dc.SavePNG(fmt.Sprintf("Fuente personalizada.%vx%v, tamaño %v, espacio %v.png", ancho, alto, tamañoFuente, espaciadoDeLineas))
}

Comenzamos creando el “lienzo” con NewContext indicando el ancho y el alto, después configuramos el fondo y el color del texto. A continuación cargamos la tipografía con LoadFontFace e indicamos el tamaño de dicha fuente.

Al invocar a DrawStringWrapped se va a escribir el texto indicado en la imagen usando Golang, ajustando el texto a una nueva línea como sea necesario.

La invocación para generar la imagen anterior queda así:

func main() {
	texto := "Agregando texto a imagen usando Golang desde el blog de Parzibyte (parzibyte.me/blog)"
	ancho := 386.00
	alto := 200.00
	tamañoFuente := 30.00
	alineacion := 0 //0 izquierda, 1 centro, 2 derecha
	dibujarConFuenteDeUsuario(ancho, alto, tamañoFuente, 1.5, texto, alineacion, "neon.ttf")
}

Toma en cuenta que en este caso “neon.ttf” es una tipografía descargada de internet, concretamente del repositorio de Monaspace, unas tipografías recientemente publicadas por GitHub.

A partir de aquí puedes usar cualquier tipografía, siempre y cuando la misma tenga formato TTF y puedas indicarla como ubicación al invocar a la función.

Fuente truetype gomonobold

Usar tipografía Go mono bold para escribir texto sobre imagen usando Golang
Usar tipografía Go mono bold para escribir texto sobre imagen usando Golang

Además de escribir texto usando una tipografía TTF descargada de internet, podemos usar algunas fuentes que Go proporciona. En ese caso necesitas instalar:

go get golang.org/x/image

Y después importar con:

import "github.com/golang/freetype/truetype"
import "golang.org/x/image/font/gofont/gomonobold"

Ahora veamos el ejemplo para usar esta tipografía y escribir texto sobre una imagen. Es casi lo mismo que mostramos arriba, pero con la diferencia de la tipografía.

func dibujarConFuenteDeGolang(ancho, alto, tamañoFuente float64, espaciadoDeLineas float64, texto string, alineacion int) error {
	dc := gg.NewContext(int(ancho), int(alto))
	font, err := truetype.Parse(gomonobold.TTF)
	if err != nil {
		return err
	}
	face := truetype.NewFace(font, &truetype.Options{
		Size: tamañoFuente,
	})
	dc.SetFontFace(face)
	dc.SetRGB(1, 1, 1) // Fondo
	dc.Clear()
	dc.SetRGB(0, 0, 0) // Color del texto
	dc.DrawStringWrapped(
		texto,
		0, 0,
		0, 0,
		ancho, espaciadoDeLineas,
		gg.Align(alineacion))
	return dc.SavePNG(fmt.Sprintf("Go.%vx%v, tamaño %v, espacio %v.png", ancho, alto, tamañoFuente, espaciadoDeLineas))
}

Ahora hemos agregado texto a una imagen usando Golang y también una tipografía de Go (Go mono bold). En este caso no es necesario que el usuario cargue la tipografía o que la tenga en el mismo lugar en el que se ejecuta el programa, digamos que la fuente va embebida.

Conclusión

Así de simple podemos escribir texto sobre una imagen usando Go. La imagen resultante será escrita en el mismo lugar donde el programa se ejecuta, en este caso el nombre de la misma depende del tamaño, espacio, etcétera (lo hice con fines de depuración).

La librería Go graphics ofrece muchas más cosas y formas de exportar la imagen resultante; puedes revisar todos los detalles en el repositorio oficial.

Yo estaba revisando esta librería para crear una imagen como texto y después imprimir dicha imagen en una impresora térmica, evitando problemas de acentos.

Encantado de ayudarte


Estoy disponible para trabajar en tu proyecto, modificar el programa del post o realizar tu tarea pendiente, no dudes en ponerte en contacto conmigo.

No te pierdas ninguno de mis posts

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.

Dejar un comentario