de dibujo en foto a vectores a transparencia en terminal

publicado el 2018-08-10


a continuación documento el proceso para convertir de una colección de fotos de dibujos monocromáticos (jpg) a ilustraciones en vectores (svg), y de ahí a imágenenes con fondo transparente (bmp) utilizando únicamente la línea de comandos.

fotografía de un dibujo con fondo blanco y tinta negra

ejemplo de fotografía en jpg

ilustración limpia en vectores con fondo transparente y tinta morada

ejemplo de resultado en png

jpg a pnm

ponemos las fotos en un mismo directorio, con nada más ahí, y navegamos adentro.

el programa a utilizar, potrace, solo acepta tipos de archivo de entrada muy específicos, uno de ellos es pnm (del cual nunca había escuchado antes).

para convertir podemos utilizar convert, ya sea con un ciclo for (lo que normalmente haría), o con el programa find (del cual estoy aprendiendo)

con ciclo for

$ for f in *jpg; do convert -verbose $f ${f%jpg}pnm; done

por cada imagen jpg, convierte el archivo con nombre original ‘f’ al archivo con el nombre ‘f’ pero con la terminación ‘jpg’ reemplazada por ‘pnm’

si tenemos foto.jpg nos genera una foto.pnm

con find

$ find *.jpg -exec convert -verbose {} {}.pnm \; 

para cada imagen jpg encontrada, ejecuta el comando de convertir el archivo con nombre original ‘{}’ al archivo con el mismo nombre pero con la terminación (y formato) ‘pnm’ añadida

si tenemos foto.jpg nos genera una foto.jpg.pnm

pnm a svg

aquí la invocación de potrace a partir de estudiar un poco la documentación:

$ potrace -s -t 20 -O 1 --tight -C '#660066' -k 0.7 \
	--progress -W 100mm *pnm

usa modo de conversión a svg (-s), quitando motas/partículas (specles) de hasta 20 pixeles de tamaño (-t 20), con tolerancia de optimización de trayectorias de 1 (-O 1), quitando los márgenes de la imagen (--tight), coloreando los vectores de color morado (-C '#660066'), con un umbral de brillo para considerar al pixel como parte del vector de 70% (-k 0.7), mostrando barra de progreso (--progress), y dándole al archivo un ancho de 100mm (-W 100mm); aplica esto con todas las imágenes pnm

(me hace falta la ilustración de hechicería)

todo este proceso nos genera imágenes con la terminación ‘.svg’ añadida.

svg a png

sirve tener los vectores, pero a veces es mejor renderearlos en un formato de mapa de bits como png para poderlos poner en web.

aquí lo interesante de la invocación es la necesidad de especificar que queremos un fondo transparente (o más bien, que no queremos fondo)

con find

$ find *svg -exec convert -verbose -background none {} \
	-resize 300x300 {}.png \;

para cada imagen svg encontrada, ejecuta el comando de convertir sin fondo el archivo con nombre original ‘{}’ al archivo con el mismo nombre pero con la terminación (y formato) ‘png’ añadida, además asegurándose de que el resultado ha de ser redimensionado para poder caber en un cuadrado de 300x300 pixeles

con ciclo for

como ejercicio para la estudiante (?)

conclusión

¿qué tal? finalmente todo este proceso se puede realizar con interfaz gráfica en inkscape, que de alguna forma en el fondo hace algo similar… pero en este caso convino aprender y realizar este proceso por tener una serie de fotos con más o menos las mismas características de iluminación y tintas - y también para conocer más las herramientas con las que contamos :)


para comentar, escríbeme a ratapanchis arroba eccs.world :)