Programant amb GIMP I. Executar plugins des de la consola

Amb aquest article vull encetar una sèrie de posts sobre la programació amb GIMP. No és un tutorial per aprendre a programar GIMP, tan sols és posar en ordre unes quantes idees enfocades a un futur projecte, que bàsicament és desenvolupar un framework per poder explicar històries tot dibuixant sobre la pantalla amb una wacom, i on es succeeixin múltiples efectes visuals i sonors. Si aquesta sèrie de posts s’acaba, en l’últim podrem veure com es toca una melodia on el pentagrama està dibuixat sobre el GIMP i les notes les dibuixo amb el ratolí o la wacom.

Primer de tot necessitem les llibreries de desenvolupament del GIMP:

$ sudo apt-get install libgimp2.0-dev

i aprenem a programar un plugin a partir d’un tutorial que si cerques per Google segur que trobes:

Amb aquest tutorial, que implementa un blur (difuminador) aprenem els conceptes bàsics de la programació amb GIMP. Els nostres plugins els programarem amb llenguatge C. Per compilar el plugin farem:

$ gimptool-2.0 –install myblur.c

Per executar el plugin ho farem des de dins del GIMP amb Filtres > Difumina > My Blur. O també ho podem fer amb un script Script-Fu: Filtres > Script-Fu > Consola

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

on substituim run-mode, image i drawable pels valors correctes. Per exemple:

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

Però a mi el que m’interessa és executar plugins des de fora del GIMP, des de la consola. La primera manera de fer-ho és amb el llenguatge de script propi del GIMP, el llenguatge 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)
)
)

Els script l’he de guardar en la carpeta de scripts del GIMP: ~/.gimp-2.6/scripts. Per executar-lo puc invocar al GIMP en mode comanda (opció -b):

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

Però encara no em convenç aquesta manera de fer. Jo el que vull és poder aplicar un plugin a una imatge oberta del GIMP, executant el plugin des de la consola, no des de dins del GIMP. I la clau està en saber que el GIMP té un servidor, el servidor Script-Fu, que treballa per defecte pel port 10008 i que escolta les peticions TCP que li vénen de la xarxa (socket). Primer de tot hem d’arrencar el servidor:

Filtres > Script-Fu > Inicia el servidor

i efectivament puc connectar-me al servidor:

$ telnet localhost 10008

però això no serveix de res si no sé el protocol per comunicar-me amb aquest servidor. Aquest protocol està explicat en aquest enllaç:

no és un protocol difícil d’entendre o implementar. Per sort, al Google trobem el script servertest.py que implementa aquest protocol. Per exemple el podem trobar en un d’aquests enllaḉos:

Ara ja puc executar el meu plugin des de la shell:

$ 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 treballa de forma interactiva. No em convenç. Faig una modificació de manera que pugui treballar de forma totalment desatesa: 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

És a dir, executo l’anterior comanda des de la consola, i de forma màgica la imatge que tinc oberta en el GIMP queda difuminada.

Ara només falta executar aquesta comanda no des de la consola, sinó des d’un executable de C, que és el meu llenguatge de referència per desenvolupar futurs projectes:

// gcc -o execute_blur execute_blur.c
int main(int argc, char *argv[])
{
\tsystem(“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

i la imatge que tinc oberta en el GIMP queda difuminada.