Python para Desenvolvedores

2ª edição, revisada e ampliada

Apêndice C: GIMP


GIMP (GNU Image Manipulation Program) é um software de código aberto bastante conhecido, que implementa várias ferramentas para processamento e edição de imagens raster (com alguns recursos vetoriais, para lidar com texto, por exemplo), além de algoritmos de conversão para diversos formatos. Permite a manipulação de imagens compostas de múltiplas camadas e possui uma arquitetura baseada em plugins que permite implementar novas funcionalidades.

Originalmente, os plugins eram criados na linguagem funcional Scheme, porém hoje é possível usar Python também, através de uma extensão chamada Gimp-Python.

Um plugin feito em Python deve seguir os seguintes passos:

  • Importar gimpfu: o módulo gimpfu define as funções e tipos necessários para o Python + possa se comunicar com o GIMP.
  • Definir função de processamento: a função que será utilizada para processar a imagem, usando a API do GIMP.
  • Registrar a função: a função register() cadastra a função de processamento na Procedural Database (PDB), permitindo que o GIMP conheça as informações necessárias para executar o plugin.
  • Executar main(): rotina principal da API.

A função de processamento terá realizar alguns passos para poder interagir corretamente com o GIMP:

  • Receber variáveis: a função recebe como argumentos a imagem (image), a camada corrente em edição (drawable) e outros que forem definidos no registro da função. Os outros parâmetros serão obtidos através de uma caixa de dialogo apresentada ao usuário antes da execução.
  • Iniciar transação: inicio da transação através da função pdb.gimp_image_undo_group_start(). A transação pode ser desfeita posteriormente através de undo.
  • Processar imagem: altera a imagem ou a camada através das funções definidas na API.
  • Terminar transação: encerra a transação através da função pdb.gimp_image_undo_group_end().

Com isso, o processamento realizado pelo plugin terá um comportamento conforme com outras funcionalidades presentes no software, incluindo a capacidade de ter a operação desfeita (undo).

Exemplo:

In [ ]:
# Importa a interface para o GIMP
from gimpfu import *

def stonify(img, drawable, fracture=135, picture=135):
    """"""
    # Inicia a transação para UNDO
    pdb.gimp_image_undo_group_start(img)
    
    # Cria uma camada de lava
    pdb.script_fu_lava(img, drawable, 10, 10, 7,
    'German flag smooth', 1, 1, 0)
    lava = img.layers[0]
    w, h = img.width, img.height
    
    # Cria uma camada de ruído
    rock = gimp.Layer(img, 'Rock', w, h, RGB_IMAGE,
    100, MULTIPLY_MODE)
    pdb.gimp_image_add_layer(img, rock, 0)
    pdb.plug_in_solid_noise(img, rock, 0, 0, 0, 1, 4, 4)
    
    # Aplica relevo nas camadas
    pdb.plug_in_bump_map(img, rock, lava,
    fracture, 45, 15, 0, 0, 0, 0, 1, 0, 0)
    pdb.plug_in_bump_map(img, rock, drawable,
    picture, 45, 30, 0, 0, 0, 0, 1, 0, 0)
    lava.visible = 0
    
    # Combina as camadas da imagem em uma só
    img.flatten()
    pdb.gimp_brightness_contrast (img.layers[0], 30, 10)
    
    # Termina a transação
    pdb.gimp_image_undo_group_end(img)

# Registra a função na PDB
register(
    # Identificação
    'Stonify',
    '"Stonify" the image...',
    '"Stonify" the image with some noise',
    'Luiz Eduardo Borges',
    'Luiz Eduardo Borges',
    '2008-2010',
    # Localização no menu
    '<Image>/Filters/Render/Stonify...',
    # Modos suportados (todos) 
    '*',
    # Parâmetros
    [
        (PF_INT, 'fracture', 'Fracture power', 135),
        (PF_INT, 'picture', 'Picture power', 135)
    ],
    # Resultados
    [],
    stonify)

# Executa o plugin
main()

Janela de opções:

Gimp

Exemplo dos passos para a geração da imagem:

Diagrama Gimp

O GIMP também permite que os plugins sejam executados através de linha de comando, usando os parâmetros --no-interface --batch.

O script precisa estar numa pasta em que o GIMP possa encontrá-lo. Para o GIMP 2.6, a pasta de plugins do usuário fica em .gimp-2.6/plug-ins abaixo do diretório home do usuário. Além disso, a extensão requer que PyGTK e suas dependências estejam instaladas.

In [1]:
 
Out[1]: