es/tutoriales/schemeb…
Scheme Básico
Texto e imágenes Copyright (C) 2002 Dov Grobgeld y no puede ser usado sin permiso del autor.
Intención
Una de las mejores características de GIMP es que se puede acceder a todas sus funcionalidades mediante
códigos. El mayor lenguaje de programación para el GIMP, que ha sido adjuntado a el actualmente, es el
SCHEME. Este documento intentará ser una introducción de ayuda al SCHEME, enseñando las esencias para
escribir códigos Script-fu, sin entrar en teorías del lenguaje de programación, típicas de otras referencias al
SCHEME.
1. Expresiones
Scheme es una variante de lisp y todas sus expresiones están entre paréntesis. Ejemplo, una lista que calculará la
suma de 3 y 4 se escribe
(+ 3 4)
El signo + es la función de adición y 3 y 4 son el primer y segundo parámetros de esta función. Las Expresiones
pueden ser anidadas, así la expresión (3+4)*(5/6), en SCHEME, se escribiría
(* (+ 3 4) (/ 5 6))
Los espacios en blanco no tienen importancia, así la expresión de encima , también, se podría escribir
(*
(+ 3 4)
(/ 5 6))
2. Funciones
Aparte de las cuatro funciones aritméticas representadas con los símbolos +-*/, hay un montón de funciones
construidas en el lenguaje. Todas tienen la forma
Funciones adicionales pueden ser definidas por el usuario mediante la palabra define. Ejemplo, una función que
calcula el valor al cuadrado de un argumento se podría declarar así
(square 5)
3. Variables y listas
Las Variables pueden declararse y configurarse mediante el comando set!. (Estas variables serán globales pero
esto no debería molestar al programador casual de GIMP). Aquí hay un par de asignaciones:
(set! grey_value 85)
(set! angle (* (/ 30 180) 3.141)
Lisp y sus variantes hacen un uso pesado de listas. Script-fu no es una excepción y usa, por ejemplo, una lista de
tres elementos para escribir un color RGB. El color naranja se escribiría así
gimp.org.es/tutoriales/schemebasic/ 1/10
11/02/2011 www.gimp.org.es/tutoriales/schemeb…
'(255 127 0)
El signo ' es necesario para decir que es una lista literal. Si se omite, el signo ' , SCHEME buscaría una función
con el nombre 255 y le enviaría dos parámetros 127 y 0, lo que, obviamente, no es lo que queremos.
Para crear una variable llamada orange con los valores de encima y, entonces, configurar el color de fondo con el,
deberíamos hacer
[Lo siguiente es una prueba de las funciones de arriba que podrían, interactivamente, llevarse a la consola Script-
fu.]
=> (set! color '(255 127 63))
(255 127 63)
=> (car color)
255
=> (cdr color)
(127 63)
Para obtener el componente azul de un color es necesario aplicar la función cdr dos veces y entonces la función
car.
Esto es un inconveniente para escribir. Por lo tanto allí, tienen que estar definidas abreviaciones de la forma cadr,
cddr, caddr, et., que concatenen las operaciones descritas arriba. La expresión anterior podría, mucho más
convenientemente, ser escrita:
=> (caddr color)
63
Para el escritor de Script-fu, uno de los más importantes usos de la función car es acceder a los valores devueltos
desde las funciones incorporadas en GIMP. Todas las funciones Gimp devuelve una lista, y, siempre, si las listas
contienen solo un elemento se debe acceder con car. Este es un ejemplo, el caso para las importantes funciones
de GIMP: Nueva imagen y Nueva capa, usadas abajo.
Las variables locales son declaradas mediante la palabra let como en el ejemplo siguiente:
(let* ((a 3)
(b 4))
((* a b)))
gimp.org.es/tutoriales/schemebasic/ 2/10
11/02/2011 www.gimp.org.es/tutoriales/schemeb…
Aquí a y b tienen un alcance local y retienen sus valores solo hasta el cierre "paréntesis" cerrados juntándolos antes
de let*.
4. GIMP PDB
Toda la funcionalidad de GIMP está disponible mediante la base de datos de procedimientos (PDB). Cada
función de la base de datos de procedimientos tiene una función correspondiente en SCHEME. Ejemplo:
Se pueden acceder a todas las funciones de PDB mediante el Examinador de procedimientos que está disponible
desde el menú principal Exts-> Examinador de procedimientos... Ejemplo, la entrada para uni-img en el
Examinador de procedimientos, la cual se definirá en el ejemplo de abajo, será algo parecido a esto:
Para los programadores Script-Fu, esta información muestra que uni-img puede ser llamada con tres parámetros
de los tipos INT32, STRING y COLOR. Los diferentes tipos se explicarán abajo.
hace mediante la función SCHEME sript-fu register. El registro tiene las siguientes propósitos:
2. Decirle al script el tipo de parámetros que el script toma y da a estos parámetros predeterminados.
El último punto de arriba, actualmente, quiere decir que un script, desde el punto de vista de GIMP,de ninguna
manera es diferente de construir un comando o un comando de plug-in. Mientras un comando esté registrado en la
PDB puede ser llamado por un script o plug-in.
Los parámetros del script-fu register se pueden dividir en dos grupos. El primer grupo de siete parámetros deben
darse siempre. Estos son:
gimp.org.es/tutoriales/schemebasic/ 3/10
11/02/2011 www.gimp.org.es/tutoriales/schemeb…
4. El autor.
5. El copyright.
6. La fecha.
7. Lista de tipo de imágenes válidas para el script. Esto solo tiene un significado sobre operaciones de scripts sobre
imágenes que todavía existen.
Después de que estos siete parámetros han sido dados, sigue una lista con los parámetros requeridos por el script.
Cada parámetro es dado como un grupo de tres artículos:
SF-COLOR
Un color RGB
SF-TOGGLE
Un valor verdadero o falso.
SF-IMAGE
SF-DRAWABLE
SF-VALUE
Un valor escalar, variable, integro o un punto flotante.
3. Un valor predeterminado.
6. Un script comentado
El siguiente script, uni.scm, recibe dos parámetros del usuario, el tamaño de la imagen y el color, y va a producir
una imagen uniforme con el tamaño y el color requeridos. No demasiado útil, pero muestra los pasos esenciales en
la producción de un código script-fu.
; Define las funciones del script y lista sus parámetros
; Los parámetros se igualarán con los parámetros dados
; abajo en script-fu-register.
(define (uni-img size color)
; Crear una imagen img y una capa layer
(set! img (car (gimp-image-new size size RGB)))
(set! layer (car (gimp-layer-new img size size
RGB "layer 1" 100 NORMAL)))
Para probar el script guardalo en $HOME/.gimp-x.x/scripts/uni.scm y entonces selecciona Exts -> Script-Fu ->
Refrescar:
gimp.org.es/tutoriales/schemebasic/ 5/10
11/02/2011 www.gimp.org.es/tutoriales/schemeb…
El script Uniform image debería aparecer, ahora, en el menú Exts -> Script-Fu -> Tutoriales -> Uniform image.
Seleccionando este script resulta la siguiente ventana :
Aceptando los parámetros predefinidos mediante el botón OK , nos da la siguiente nueva imagen:
También, es posible acceder a este script a través de la consola Script-Fu tecleando el comando
<Image>/Script-Fu/...
Entonces el script estará disponible mediante el menú de GIMP que se puede lanzar pinchando con el botón
derecho del ratón sobre la imagen. El script debe tener, también, como primer y segundo argumentos un SF-
IMAGE y un SF-DRAWABLE.
Aquí está un ejemplo de script que copia la capa actual a una capa nueva la desenfoca y la invierte
gimp.org.es/tutoriales/schemebasic/ 6/10
11/02/2011
Aquí está un ejemplo de script quewww.gimp.org.es/tutoriales/schemeb…
copia la capa actual a una capa nueva, la desenfoca y la invierte.
; Darle un nombre
(gimp-layer-set-name new-layer "Gauss-blurred")
(script-fu-register "script-fu-copy-blur"
"<Image>/Script-Fu/Tutorial/copy-blur"
"Copy and blur a layer"
"Dov Grobgeld"
"Dov Grobgeld"
"2002"
"RGB*, GRAY*"
SF-IMAGE "Image" 0
SF-DRAWABLE "Layer to blur" 0
SF-VALUE "Blur strength" "5")
gimp.org.es/tutoriales/schemebasic/ 7/10
11/02/2011 www.gimp.org.es/tutoriales/schemeb…
Si tenemos una selección activa cuando se llama a gimp-edit-fill, solo la selección es pintada. Hay varias maneras
de elegir una selección como puede verse cuando buscamos por una "select" en la PDB. Usaremos gimp-rect-
select, cuya entrada en la PDB se ve como sigue:
Un simple uso de esta función la cual selecciona el rectángulo (x, y, ancho, alto)=(0, 25, 100, 50), pinta esa región
de azul y realiza la selección se ve como sigue:
8. Loops
La única construcción looping que existe en Script-Fu es while
[Nota: esto se da en el actual interprete de SCHEME, SIOD, usado en Script-Fu. Una vez que el interprete de
SCHEME planea cambiar a Guile,provablemente, serán añadidas más construcciones looping ]. El loop while se
ve como sigue
gimp.org.es/tutoriales/schemebasic/ 8/10
11/02/2011 www.gimp.org.es/tutoriales/schemeb…
(while (condition)
(statement1)
(statement2)
:
)
9. Selecciones flotantes
Cuando pegas una imagen del portapapeles o cuando creas un texto en un dibujable, el resultado no se pone
directamente en el dibujable. En lugar de eso la pone en una capa especial temporal conocida como una selección
flotante. La selección flotante puede ser manipulada de varias maneras, y finalmente mezcladas en su capa
asociada, un proceso conocido como anclar.
; Start an undo group. Everything between the start and the end will
; be carried out if an undo command is issued.
(gimp-undo-push-group-start img)
; Anclar la selección
(gimp-floating-sel-anchor text-float)
; Flush output
(gimp-displays-flush))
(script-fu-register "script-fu-hello-world"
"<Image>/Script-Fu/Tutorial/Hello World"
"Write Hello World in the current image"
"Dov Grobgeld <dov@imagic.weizmann.ac.il>"
"Dov Grobgeld"
"2002-02-12"
gimp.org.es/tutoriales/schemebasic/ 9/10
11/02/2011 www.gimp.org.es/tutoriales/schemeb…
"RGB*, GRAY*"
SF-IMAGE "Input Image" 0
SF-DRAWABLE "Input Drawable" 0)
Este script muestra otra característica que no hemos mostrado antes. La posibilidad de crear un grupo deshacer.
Todos los comandos entre los comandos gimp-undo-push-group-begin y gimp-undo-push-group-end son
deshechos juntos si el comando deshacer es activado
Para copiar una selección, se usa el comando gimp-edit-copy. Coloca una copia del contenido de la selección en
el búfer cortar. El contenido del búfer cortar puede entonces ser pegados en una capa, la misma capa o otra, y es
pegada, entonces, como una capa flotante.
En el siguiente ejemplo, la selección es copiada, pegadas en la misma capa, offset a distancia fija, y, finalmente,
anclada. Inténtalo dibujando un pequeño globo en el medio de la imagen, selecciónalo, y llama a este script.
(gimp-undo-push-group-start img)
(gimp-edit-copy drawable)
(set! sel-float (car (gimp-edit-paste drawable FALSE)))
(gimp-layer-set-offsets sel-float 100 50)
; Flush output
(gimp-displays-flush))
(script-fu-register "script-fu-sel-copy"
"<Image>/Script-Fu/Tutorial/Selection Copy"
"Copy the selection into the same layer"
"Dov Grobgeld"
"Dov Grobgeld"
"2002-02-12"
"RGB*, GRAY*"
SF-IMAGE "Image" 0
SF-DRAWABLE "Layer" 0)
Traducido por AntI (Ant.Ign at gmail), Octubre de 2005 – Agradezco a Dov Grobgeld la autorización para usar
y traducir su tutorial.
gimp.org.es/tutoriales/schemebasic/ 10/10