Automágica: durante 2017 estoy trabajando bastante en Automágica, mi software para editar libros: Más información - Posts relacionados


Manipulación de pixels con Python-Fu

Usando GIMP y el complemento que permite crear plug-ins en Python podemos hacer manipulación a bajo nivel de los pixels de una imagen.

PixelRegion

PixelRegion permite realizar una abstracción sobre una imagen de forma tal de verla como una región de pixeles. Cada posición x,y de la región corresponde a un pixel de la imagen. En el caso de las imágenes RGB, cada pixel tiene 3 valores. En Python-Fu estos valores son representados con un string de 3 caracteres en el que cada caracter es uno de aquellos que tiene su número de orden (función ord) entre y 255.

Los siguientes ejemplos son una demostración sencilla de como trabajar con PixelPerfect para manipular imágenes. En el primer ejemplo se leen los valores de algunos de los pixeles de la imagen y en el segundo se escriben otros.

Ejemplo 1 (lectura)

La siguiente imagen de 5x5 pixeles (ampliada) será usada para este ejemplo:

5×5 pixel image

Imagen original

La función pixel es la que se ejecutará cuando ejecutemos el plug-in creado para este ejemplo. No se ingresan parámetros desde la interfaz gráfica del mismo, pero la función recibe 2 argumentos. Objetos que representan la imagen y la capa (layer) a procesar.

def pixels(img, layer):



    w = layer.width

    h = layer.height



    pr = layer.get_pixel_rgn(0, 0, w, h)



    print "Valores de los pixeles de las esquinas de la imagen"



    r,g,b = pr[0,0]

    print [ord(x) for x in r,g,b]



    r,g,b = pr[0,4]

    print [ord(x) for x in r,g,b]



    r,g,b = pr[4,0]

    print [ord(x) for x in r,g,b]



    r,g,b = pr[4,4]

    print [ord(x) for x in r,g,b]



    layer.update(0, 0, w, h)

    layer.flush()

    gimp.displays_flush()

El ejemplo es sencillo y lo que hace es instanciar una PixelRegion tan grande como la capa (layer). Luego los diferentes pixeles de la misma pueden accederse mediante sus coordenadas: pr[x,y].

Se muestran los valores RGB de cada uno de los puntos del ejemplo.

Código fuente: pixels-read.py

Ejemplo 2 (escritura)

En una porción de código que empieza de forma similar a la del ejemplo anterior podemos ver que una vez que hemos obtenido la PixelRegion que nos interesa, podemos escribir pixeles en ella.

El siguiente ejemplo aplicado sobre la imagen del ejemplo anterior dibuja una equis amarilla:

def pixels_write(img, layer):



    w = layer.width

    h = layer.height

    pr = layer.get_pixel_rgn(0, 0, w, h)



    yellow_rgb = (255,255,0)

    yellow_str = chr(yellow_rgb[0]) + chr(yellow_rgb[1]) + chr(yellow_rgb[2])



    for i in xrange(5):

        pr[i,i] = yellow_str

        pr[4-i,i] = yellow_str



    layer.update(0, 0, w, h)

    layer.flush()

    gimp.displays_flush()

5×5 image with yellow pixels

Imagen procesada con el código del ejemplo 2

Código fuente: pixels-write.py

Links


Creando plug-ins para GIMP con Python (charla)

Este es el material de la charla que dí el sábado pasado (19 de agosto) en el 1º Python Day del Grulic:

    <li><a href="http://www.juanjoconti.com.ar/files/python/fu/charla-cordoba/index.html">Presentación (navegable y link al formato original)</a></li>
    
    <li>Código fuente</li>
    

    También tengo un texto que escribí para ordenar mis ideas, pero está muy desprolijo como para publicarlo. SI alguien lo quiere (es buena ayuda para seguir la presentación) pídamelo por mail y se lo mando.




    Plug-in para gimp que genera constelaciones PSK

    Este es mi primer plug-in para gimp. Es un plug-in para gimp escrito en Python de 150 líneas:

    PSK Plug-in

    Si en la opción numérica de la ventana anterior se elije 3 se obtiene esta imange:

    8-PSK

    Y si se elije 4 esta:

    16-PSK

    El código fuente puede obtenerse aquí.


    El arte de Python-Fu (cinturón blanco)

    Como parte de mi aprendizaje del lenguaje de programación Python y por la necesidad de generar automáticamente algunos dibujos, incurcioné en el milenario arte del Python-Fu.

    Si querés conocer más sobre este acestral arte, seguí leyendo..

    Script-Fu (un dialecto de Scheme) es el lenguaje original (además de C) utilizado para escribir plug-ins para Gimp (The GNU Image Manipulation Program). Actualmente se pueden escribir plug-ins en otros lenguajes como Perl, Tcl y.. Python

    ¿qué hay que tener instalado?

      <li>python (<code>apt-get install python</code> en Debian GNU/Linux)</li>
      
      <li>gimp (<code>apt-get install gimp</code>)</li>
      
      <li>pygimp (<code>apt-get install gimp-python</code>)</li>
      

      Los dos primeros programas suelen estar instalados en la mayoría de las instalaciones de GNU/Linux, el último no. Una verificación rápida puede hacerse ejecutando gimp y buscando la opción Python-Fu en el menú Exts.

      Script-Fu

      En http://www.jamesh.id.au/software/pygimp/structure-of-plugin.html se puede ver la estructura de un Script-Fu.

      Cuando gimp es ejecutado, busca los archivos ejecutables que se encuentran en $HOME/.gimp-x-y/plug-ins/. En el caso de los scripts en python, la función register() es ejecutada y cuando se acceda al plug-in mediante el menú especificado se ejecutará su función principal. Antención a esto: los archivos deben ser tener encendido el bit de ejecución (chmod +x hello-world.py).

      Otro tip: si algo no funciona como se espera, una forma de enterarse que pasó es ejecutar gimp desde una terminal (gimp --verbose) y leer en esta las distintas salidas que produce el programa (allí se van a escribir los errores que se produzcan en tiempo de ejecución).

      Links útiles

      [update: a pedido del público: hello-world.py]

      Pueden bajar hello-world.py para ver un ejemplo sencillo. Debería generar una imagen como esta:Hello Worldsalvo que cambien los parámetros ;-)