GIMP tiene un lenguaje de scripting, al que todos se refieren como Script-fu; pero que se llama Scheme y es una variante de LISP.
Los scripts de GIMP, entonces, tienen la extensión *.scm
y pueden guardarse en ~/.gimp-2.x/scripts/
(En Win7 está en C:\Users\miusuario\.gimp-2.x\scripts
).
Tengo la intención de hacer un pequeño script; así que empecé, como siempre, a coleccionar enlaces (hasta el final). Poco a poco iré aumentando el contenido de otras secciones.
Algo que puede ser un poco confuso, al inicio, es la sintaxis de Scheme. El manual de GIMP tiene una sección fácil de entender. Por alguna extraña razón, la mayoría de los tutoriales que se pueden encontrar, no hacen buen énfasis en la sintaxis.
El contexto let*:
(let* ( variables )
expressions )
Es importante mencionar que para poder utilizar el comando set!, es necesario haber declarado la variable con anterioridad.
Por ejemplo:
(let* (
(mask 8)
(sharpness 0.8)
(black 0.2)
(white 0.2)
)
(plug-in-photocopy RUN-NONINTERACTIVE image dup_layer mask sharpness black white)
)
Aquí hay 4 variables declaradas dentro del bloque let*; pero sólo existen dentro de dicho bloque. Y sólo dentro de ese bloque es que se pueden modificar.
Definir una función:
(define
(
name
param-list
)
expressions
)
Aquí se puede ver la declaración de una función; pero es importante mencionar que name
se refiere al nombre de la función y param-list
a los parámetros que recibe. Sin embargo, en expressions
no puede haber declaraciones de variables; sólo expresiones o comandos. Por eso, normalmente una función suele tener un bloque de let*. Por ejemplo:
; Mi función..
(define (script-fu-noir image drawable)
(let* (
; variables "locales" de mi función..
(dup_layer 0 ) ; inicializada en cero..
)
; expressiones o comandos..
)
)
En este ejemplo, también podemos ver algo muy importante: comentarios. Los comentarios se hacen escribiendo un punto-y-coma y terminan hasta el final de la línea.
La mayoría de los comandos de GIMP regresan listas (aparentemente herencia de LISP), en lugar de parámetros simples, aún cuando la lista sólo contenga un parámetro.
En el manual, hay una sección sobre listas, pero vamos a mencionar 3 expresiones útiles:
car
La expresión car, regresa el primer elemento de la lista. Simplemente:
(car '("uno" 2 "tres"))
regresa
"uno"
cdr
La expresión cdr, regresa los elementos de la lista, exceptuando el primero. Entonces:
(cdr '("uno" 2 "tres"))
regresa
(2 "tres")
combinaciones de car y cdr
Entre car y cdr, se pueden acceder todos los elementos de una lista, pero en lugar de ejecutar:
(car (cdr '("uno" 2 "tres")))
para obtener el segundo elemento, podemos ejecutar:
(cadr '("uno" 2 "tres"))
Otras combinaciones son posibles, como caddr
, cadar
, etc.
Cualquier script cuenta, como mínimo, una función principal, y el registro del script (para que aparezca en el menú de GIMP).
Volviendo a mi ejemplo de función anterior..
; Mi función..
(define (script-fu-noir image drawable)
(let* (
; variables "locales" de mi función..
(dup_layer 0 ) ; inicializada en cero..
)
; expressiones o comandos..
)
)
El nombre de esta función es script-fu-noir
, y recibe 2 parámetros: image
, la imágen; y drawable
, la porción dibujable de la imágen. Pero para poder pasarle los parámetros de imágen y dibujable desde GIMP, debemos registrar el script.
El registro es la forma en que especificamos a GIMP las características de nuestro script:
(script-fu-register "script-fu-noir" ; Nombre de la función principal
"<Image>/Filters/Artistic/Noir" ; Ubicación en el menú
"Converts to noir-themed artistic" ; Descripción
"Rodrigo Flores" ; Autor
"Rodrigo Flores" ; Créditos
"2011" ; Fecha
"RGB*, GRAY*" ; Tipo de imágen en la que funciona
SF-IMAGE "Image" 0 ; Primer parámetro de la función
SF-DRAWABLE "Layer" 0) ; Segundo parámetro de la función...
Mientras que las primeras 7 líneas son prácticamente informativas (pero obligatorias); a partir de la octava, depende de cómo funcione nuestro script (y son opcionales). En el manual, se pueden ver las diferentes opciones de parámetros opcionales. Sin embargo, si el script trabaja sobre una imágen previamente abierta, el primer parámetro debe ser forzosamente SF-IMAGE y el segundo debe ser SF-DRAWABLE.