Con este artículo quiero empezar una serie de posts sobre la programación con GIMP. No es un tutorial para aprender a programar GIMP, tan sólo es poner en orden unas cuantas ideas enfocadas a un futuro proyecto, que básicamente es desarrollar un framework para poder explicar historias mientras dibujas sobre la pantalla con una wacom, y donce se suceden múltiples efectos visuales y sonoros. Si esta serie de posts se acaba, en el último podremos ver cómo se toca una melodía donde el pentagrama está dibujado sobre el GIMP y las notes las dibujo con el ratón o la wacom.
Ante todo necesitamos las librerías de desarrollo del GIMP:

$ sudo apt-get install libgimp2.0-dev

y aprendemos a programar un plugin a partir de un tutorial que si buscas por Google seguro que encuentras:

Con este tutorial, que implementa un blur (difuminador) aprendemos los conceptos básicos de la programación con GIMP. Nuestros plugins los programaremos en lenguage C. Para compilar el plugin haremos:

$ gimptool-2.0 –install myblur.c

Para ejecutar el plugin lo haremos des de dentro del GIMP con Filtros > Difumina > My Blur. O también lo podemos hacer con un script Script-Fu: Filtros > Script-Fu > Consola

(plug-in-myblur run-mode image drawable)

donde sustituimos run-mode, image i drawable por los valores correctos. Por ejemplo:

(plug-in-myblur RUN-NONINTERACTIVE 1 2)

Pero a mi lo que me interesa es ejecutar plugins desde fuera del GIMP, desde la consola. La primera manera de hacerlo es con el lenguatge de script propio del GIMP, el lenguaje Scheme.

example_script.scm:

(
define (example-script inputFilename outputFileName)
(
let* (
(image (car (gimp-file-load RUN-NONINTERACTIVE inputFilename inputFilename)))
(drawable (car (gimp-image-get-active-layer image)))
)
(plug-in-myblur RUN-NONINTERACTIVE image drawable)
(gimp-file-save RUN-NONINTERACTIVE image drawable outputFileName outputFileName)
)
)

Los scripts los he de guardar en la carpeta de scripts del GIMP: ~/.gimp-2.6/scripts. Para ejecutarlo puedo invocar al GIMP en modo comando (opción -b):

$ gimp -i -b “(example-script \”confirmacion.jpg\” \”confirmacion_out.jpg\”)” -b “(gimp-quit 0)”
batch command executed successfully

Pero todavía no me convence esta manera de hacer. Yo lo que quiero es poder aplicar un plugin a una imagen abierta del GIMP, ejecutando el plugin desde la consola, no desde dentro del GIMP. I la clave está en saber que el GIMP tiene un servidor, el servidor Script-Fu, que trabaja por defecte por el puerto 10008 i que escucha las peticiones TCP que le llegan de la red (socket). Primero de todo hemos de arrancar el servidor:

Filtres > Script-Fu > Inicia el servidor

y efectivamente puedo conectarme al servidor:

$ telnet localhost 10008

pero esto no sirve de nada si no sé el protocolo para comunicarme con este servidor. Este protocolo está explicado en este enlace:

no es un protocolo difícil de entender o implementar. Por suerte, en Google encontramos el script servertest.py que implementa este protocolo. Por ejemplo lo podemos encontrar en uno de estos enlaces:

Ahora ya puedo ejecutar mi plugin desde la consola:

$ python servertest.py
Trying ::1.
Trying 127.0.0.1.
Script-Fu-Remote – Testclient
> (plug-in-myblur RUN-NONINTERACTIVE 1 2)
(OK): Success
>

servertest.py trabaja de forma interactiva. No me convence. Hago una modificación de manera que pueda trabajar de forma totalment desatendida: script servertest_v2.py (http://wiki.joanillo.org/index.php/Programaci%C3%B3_GIMP#Servidor_Script-Fu)

$ python servertest_v2.py localhost 10008 “(plug-in-myblur RUN-NONINTERACTIVE 1 2)”
HOST: localhost
PORT: 10008
COMMAND: (plug-in-myblur RUN-NONINTERACTIVE 1 2)
Trying ::1.
Trying 127.0.0.1.
(plug-in-myblur RUN-NONINTERACTIVE 1 2)
(OK): Success

Es decir, ejecuto el anterior comando desde la consola, y de forma mágica la imagen que tengo abierta en el GIMP queda difuminada.

Ahora sólo falta ejecutar esta comando no desde la consola, sino desde un ejecutable de C, que es mi lenguaje de referencia para desarrollar futuros proyectos:

// gcc -o execute_blur execute_blur.c
int main(int argc, char *argv[])
{
system(“python servertest_v2.py localhost 10008 \”(plug-in-myblur RUN-NONINTERACTIVE 1 2)\”");
}

$ ./execute_blur

HOST: localhost
PORT: 10008
COMMAND: (plug-in-myblur RUN-NONINTERACTIVE 1 2)
Trying ::1.
Trying 127.0.0.1.
(plug-in-myblur RUN-NONINTERACTIVE 1 2)
(OK): Success

y la imagen que tengo abierta en el GIMP queda difuminada.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

*