Table of Contents

Fuente: https://www.seul.org/~grumbel/gimp/script-fu/script-fu-tut.html

Para crear scripts (macros) desde Gimp se hace con Script Fu

Para lanzar comandos a mano:

Filters > Script-Fu > Console

Se abre una ventana como esta:

Para crear una nueva imagen:

(gimp-image-new 256 256 RGB)

Devuelve esto:

> (gimp-image-new 256 256 RGB)
(14)

Lo que devuelve es el ID de la nueva imagen, en este caso 14. No muestra la imagen, para mostrarla:

(gimp-display-new 14)

Y ya nos aparece.

Para ver una lista de las imágenes que tenemos abiertas:

(gimp-image-list)
(3 #(21 20 17))

Nos indica que hay 3 y nos las pone por orden de la mas nueva a la mas vieja. Si queremos coger el ID de la mas nueva, sería la posición 0:

(let (
      (MyIMAGE (aref (cadr (gimp-image-list)) 0))
      )
  MyIMAGE
)
21

Ampliar selección

Tenemos una imagen con una selección hecha. Listamos el id de la imagen:

> (gimp-image-list)
(1 #(12))

Ahora ampliamos la selcción 20 pixels. Si devuelve #t es TRUE:

gimp-selection-grow image steps
> (gimp-selection-grow 12 20)
(#t)

Creamos un borde de 8 pixels:

> (gimp-selection-border 12 8)
(#t)

Vemos en que layer estamos:

>  (gimp-image-get-active-layer 12)
(2588)

Si hacemos doble click en la layer también nos sale:

Si tuvieramos mas de una layer, las podemos listar así:

> (gimp-image-get-layers 12)
(3 #(2593 2592 2588))

Para rellenar en nuestra layer, que es la 2588:

> (gimp-drawable-edit-fill 2588 1)
(#t)

Variables

Se tienen que definir en el mismo comando:

(let ((x 2))
  x
)
2

Para mas de una variable con let*

(let ((x 2)
      (y 6)
     )
  (+ x y)
)
8

Para coger el resultado de un comando en una variable, se tiene que usar el comando car sinó, da error. Por ejemplo la función gimp-image-get-active-layer que devuelve (2588)

(let* ((MyIMAGE 12) 
       (MyLAYER (gimp-image-get-active-layer MyIMAGE))
      )
  MyLAYER
)
(2588)

Para poder operar con la variable MyLAYER tiene que ser sin paréntesis con la función car

(let* ((MyIMAGE 12) 
       (MyLAYER (car (gimp-image-get-active-layer MyIMAGE)))
      )
  MyLAYER
)
2588

Ejemplos

Ejemplo 1

Desde una selección, amplía, hace borde y rellena con BG

(let* ((MyIMAGE 12) 
       (MyLAYER (car (gimp-image-get-active-layer MyIMAGE)))
      )
  (gimp-selection-grow MyIMAGE 8)
  (gimp-selection-border MyIMAGE 8)
  (gimp-drawable-edit-fill MyLAYER 1)
)

Está seleccionado lo azul.

Ejemplo 2 (RISK)

Creamos el borde en una nueva capa. Lo hace sobre la última imagen. Mejor solo tener una abierta.

(let* ((MyIMAGE (aref (cadr (gimp-image-list)) 0))
       (MyLAYER (car (gimp-image-get-active-layer MyIMAGE)))
      )
  (gimp-selection-grow MyIMAGE 8)
  (gimp-selection-border MyIMAGE 8)
  (gimp-drawable-edit-fill MyLAYER 1)
  (gimp-edit-copy MyLAYER)
  (let ((MyFLOATING (car (gimp-edit-paste MyLAYER FALSE))))
    (gimp-floating-sel-to-layer MyFLOATING)
  )
)

Guardando selecciones:

(let* (
        (MyIMAGE (aref (cadr (gimp-image-list)) 0))
        (MyLAYER (car (gimp-image-get-active-layer MyIMAGE)))
        (MySELECTION1 (car (gimp-selection-save MyIMAGE)))
      )
  (gimp-selection-grow MyIMAGE 8)
  (gimp-selection-border MyIMAGE 8)
  (gimp-edit-copy MyLAYER)
  (let* (
          (MySELECTION2 (car (gimp-selection-save MyIMAGE)))
          (MyFLOATING (car (gimp-edit-paste MyLAYER FALSE)))
        )
    (gimp-floating-sel-to-layer MyFLOATING)
    (let (
           (MyLAYER2 (car (gimp-image-get-active-layer MyIMAGE)))
         )
        (gimp-image-select-item MyIMAGE 2 MySELECTION1)
        (gimp-drawable-edit-fill MyLAYER2 0)
        (gimp-image-select-item MyIMAGE 2 MySELECTION2)
        (gimp-drawable-edit-fill MyLAYER2 1)
    )
  )
)

Ejecutar Script

Copiamos este script en el directorio de scripts con la extensión scm. Para saber cual es el directorio de scripts, vamos a:

Edit > Preferences > Folders > Scripts

Suele ser:

<HOME>/.config/GIMP/2.10/scripts

En este ejemplo, aparece con el nombre Risk en el menu de Filters. Una vez copiado, para que aparezca en el menú, pulsamos: Filters > Script-Fu > Refresh Scripts

( define (script-fu-risk)
(let* (
        (MyIMAGE (aref (cadr (gimp-image-list)) 0))
        (MyLAYER (car (gimp-image-get-active-layer MyIMAGE)))
        (MySELECTION1 (car (gimp-selection-save MyIMAGE)))
      )
  (gimp-selection-grow MyIMAGE 8)
  (gimp-selection-border MyIMAGE 8)
  (gimp-edit-copy MyLAYER)
  (let* (
          (MySELECTION2 (car (gimp-selection-save MyIMAGE)))
          (MyFLOATING (car (gimp-edit-paste MyLAYER FALSE)))
        )
    (gimp-floating-sel-to-layer MyFLOATING)
    (let (
           (MyLAYER2 (car (gimp-image-get-active-layer MyIMAGE)))
         )
        (gimp-image-select-item MyIMAGE 2 MySELECTION1)
        (gimp-drawable-edit-fill MyLAYER2 0)
        (gimp-image-select-item MyIMAGE 2 MySELECTION2)
        (gimp-drawable-edit-fill MyLAYER2 1)
        (gimp-selection-none MyIMAGE)
        (gimp-image-remove-channel MyIMAGE MySELECTION1)
        (gimp-image-remove-channel MyIMAGE MySELECTION2)
        (gimp-displays-flush)
    )
  )
)
)

  (script-fu-register
    "script-fu-risk"                            ;func name
    "Risk"                                      ;menu label
    "Crea un Layer con el pais seleccionado
      de color de FG y el borde mas gordo"      ;description
    "Iwanttobefreak"                            ;author
    "copyleft 2021"                             ;copyright notice
    "Setember 22, 2021"                          ;date created
    ""                     ;image type that the script works on
)
  (script-fu-menu-register "script-fu-risk" "<Image>/Filters")