Gimp: recortar una imagen en línea de órdenes

A menudo he necesitado este script y por fin me he puesto a implementarlo. Consiste en un script-fu que se le puede pasar a gimp para recortar una imagen de forma automática. Contaré los pasos que he seguido y al final hay un resumen para 'ir más rápido'.

Ingredientes

No os lo vais a creer: gimp.

# apt-get install gimp

Seguro que en Mindows es más fácil de instalar.

Mi primer script

Lo primero que necesitado ha sido una manera de ejecutar un script. Para ello, he abierto mi imagencilla con Gimp de la forma habitual:
$ gimp tab1.png

Después hay que irse a la ventana principal de Gimp, donde están las herramientas, y acceder a "Exts"->"Script-fu"->"Consola de Script-fu". Se nos abrirá una ventana bastante fea. Antes de avanzar, pulsamos el botón "examinar". Se nos abrirá la ventana de ayuda que podemos tener danzando por ahí mientras nos damos cabezazos contra la pared con nuestro script.

Vamos con mi "hola mundo". En esta ocasión, consistió en seleccionar toda la imagen :-D

(gimp-selection-all 1)

Ahora lo explico: estoy llamando a la función "gimp-selection-all" con el parámetro "1", que es el identificador de la imagen (como la acabamos de abrir, debería ser el 1 :D). Para comprobar el resultado, vamos a la ventana de la imagen y debería estar seleccionado todo.

El Script

Ahora que sabemos usar perfectamente script-fu, vamos con el script que recorta una imagen:

(let* \
    ( \
        ( img (gimp-file-load 0 "/ruta_hasta_la_imagen/tab1.png" "tab1.png") ) \
        ( drw (gimp-image-get-active-drawable (car img)) ) \
    )  \
    (plug-in-autocrop 0 (car img)  (car drw)  )\
    (plug-in-colortoalpha 1 (car img) (car drw) '(0 0 0) )  \
    (gimp-file-save 1 (car img) (car drw )   "/ruta_hasta_la_imagen/ejemplo.png" "ejemplo.png") \
) 

Lo he separado en líneas para que lo veáis bonito :D. La barra invertida: "\" sólo sirve para indicar que va todo en la misma línea.

Ahora explico: "let*" me permite definir variables. Así defino dos: una es "img" y otra "drw". Casi todas las funciones requieren estos parámetros, así que me los guardo "para luego" y así es más fácil todo. Al declarar "img" le asigno el valor devuelto por la función "gimp-file-load", que me ha cargado la imagen, pasándole un "0" ("no interactivo"), la ruta hasta la imagen y "el nombre dado por el usuario", que creo que es el nombre de la imagen sin el path.

Igualmente, a "drw" le asigno el resultado de "gimp-image-get-active-drawable", donde " (car img)" es una llamada a una función que me da el primer elemento del vector "img" (no sé explicarlo mejor. No he conseguido quitarme de encima el "car" ése).

Con eso ya tengo las dos variables locales que, como locales que son, sólo existirán hasta que cierre el "let*" (por eso lo cierro al final).

El primer argumento del resto de funciones siempre es el modo interactivo, el problema es que de homogeneidad nada: unas funciones toman el 0 como "interactivo" y otras como "no-interactivo". En el ejemplo todas están a "no-interactivo".

Por orden, hago: Cargar la imagen (como hemos visto), recortar la imagen, transformar el color blanco a alpha (éste es un bonus track) y guardar la imagen.

No me enrollo más.

Batch mode

Claro, nada de esto tiene gracia si tengo que estar abriendo el gimp para cada una de mis 159 imágenes que quiero procesar... Así que a currarme la línea de órdenes:

$ gimp -i -b '(let* ( ( img (gimp-file-load 0 "/ruta_hasta_la_imagen/tab1.png" "tab1.png") ) ( drw (gimp-image-get-active-drawable (car img)) ) )  (plug-in-autocrop 0 (car img)  (car drw)  ) (plug-in-colortoalpha 1 (car img) (car drw) '(0 0 0) )   (gimp-file-save 1 (car img) (car drw )   "/ruta_hasta_la_imagen/ejemplo.png" "ejemplo.png") )  (gimp-quit 0)'

A gimp tengo que pasarle la orden "-i" (no interactivo) y "-b" (ejecútame este batch) con la ristra que hemos comentado antes. Tan sólo le he añadido un detallito, que es la orden "gimp-quit" para que no se quede en "modo gimp".

Hay una forma de hacer que me procese todas las imágenes de golpe... Pero eso lo dejaré para otra receta, ya que yo voy a utilizar un precioso Makefile que me va a ir transformando todas las imágenes y me las va a actualizar cuando las modifique (mientras que con gimp tendría que volver a procesar todas), así que lo dejaré en el tintero.

Y fin

No sé si esto resultará útil para alguien, pero puedo asegurar que para mí sí, y como no sabía dónde ponerlo y el script-fu es infernal, lo he plantao aquí, que hacía mucho que no saba señales de vida.

Referencias

Pues un poco de aquí y otro de allá:

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de greenbite

imagemagick

Esta muy bien el tuto, y realmente un buen ejemplo.

Recomiendo también echarle un ojo a imagemagick, es un programa de retoque fotográfico pero por linea de ordenes, es ideal para hacerse scripts de shell con llamadas a comandos de imagemagick.

Por ejemplo para recortar una imagen podríamos hacer: convert paged.gif -crop 32x32+16+16 crop_page.gif

Podeis ver una lista de ejemplos en esta dirección: http://www.imagemagick.org/Usage/

Visita mi Blog de Informatica : http://www.greenbiteblog.org

Imagen de magmax

imagemagick

Lo conozco Laughing out loud

El tema es que lo que yo tenía era el resultado de Lilypond, es decir: un ps de tamaño página con un pequeño pentagrama arriba a la izquierda. El tema es que tengo unas 240 imágenes y paso de estar estableciendo límites para cada una de ellas, y con el script que proporciono se hace automático Laughing out loud

Con el convert que me indicas hay que indicar qué quieres cortar, mientras que con el mío, no lo sabes Eye-wink

Debo decir que es lo primero que hago en script-fu, así que os he contado todos mis conocimientos al respecto...

Miguel Ángel García
http://magmax.org

Imagen de greenbite

script-fu

Si, si esta muy bien el script-fu. Además es mucho más complicado programarlo en Gimp que hacerlo con Imagemagick. Sólo puse el comentario por si no habiais oido hablar de Imagemagick a modo información.

Desde aquí te animo a hacer algun tuto mas de script-fu ya que es un tema muy interesante.

Visita mi Blog de Informatica : http://www.greenbiteblog.org

Imagen de int-0

Ohh...

una receta sobre script-fu podría ser interesante Sticking out tongue

------------------------------------------------------------
$ python -c "print 'VG9udG8gZWwgcXVlIGxvIGxlYSA6KQ==\n'.decode('base64')"
------------------------------------------------------------