sábado, 11 de maio de 2013

Gimp - Criação de Plug-ins Python

Uma das maiores vantagens do Gimp, além de ser livre, é a possibilidade de se poder criar plug-ins. Para isso, podemos utilizar a linguagem C (na qual o Gimp foi escrito) ou a flexível Python. Este artigo que vou escrever (espero o primeiro de vários) foi criado com base na publicação de Chobo Programmer. O problema é que alguns detalhes não ficaram muito claros, e pretendo destrinchar um pouco mais aqui.


O objetivo deste plug-in é gerar um conjunto de imagens semelhantes, com a variação de um número, baseadas em um único template. Baixe o template aqui. O arquivo template é um arquivo imagem em formato Gimp (*.xcf) contendo um campo texto (que sua camada deve chamar Text), neste campo que o Script trabalha. Gera um número indicado de imagens e cada uma possui um número sequencial, que será iniciado por um número informado. Desta forma é possível por exemplo, gerar 100 imagens de bolinhas onde cada uma delas possui um número.

Como sou brasileiro, resolvi adaptar o plug-in, e aí começaram meus problemas, não se pode usar acentos a menos que o script seja escrito em codificação UTF-8, por isso na inicial do programa possui o código:
# -*- coding: utf-8 -*-
Isso instrui o Python a permitir códigos acentuados no padrão UTF-8. E assim, a janela mostrada pode conter os caracteres acentuados:


Outro detalhe que devemos sempre lembrar é relativo a edentação em Python, isso é extremamente importante, pois informa ao compilador que estamos em um método ou em um comando, então o que é opcional em outras linguagens aqui é obrigatório.

Não existe uma forma "prática" de testar esse Script, ou seja, se estiver com erro devemos sair do Gimp modificar o Script e retornar ao Gimp (algumas vezes inclusive é ideal mudar o nome do Script - Cuidado e Atenção).

Mas ao final é apaixonante saber que podemos possuir um total controle sobre este poderoso Editor de Imagens (concorrente do todo poderoso Photoshop) e saber que a partir de agora podemos automatizá-lo de qualquer forma.

Detalhes do Script (já totalmente em português)
# -*- coding: utf-8 -*-

#!/usr/bin/env python

from gimpfu import *
import os

def run(*args):
    # Definir os cinco argumentos de Entrada
    arquivo, num, tot, nome, dirSaida, zeros = args

    # Verificar se foi informado o diretório de saída
    dirSaida = os.path.expanduser('~/' + dirSaida)
    if not os.path.exists(dirSaida):
        os.makedirs(dirSaida)
    for i in xrange(1, tot+1):
        # Abrir o arquivo de template 
        im = pdb.gimp_file_load(arquivo, arquivo)
        # Nome da camada Texto na template deve ser 'Text'
        camada = filter(lambda  x: x.name == 'Text', im.layers)[0]
        # Adicionar o número para a camada de texto
        numStr = str(num)
        pdb.gimp_text_layer_set_text(camada, numStr.zfill(zeros))
        # Adicionar mais um ao número
        num += 1
        # Fazer um merge da camada para a imagem...
        merged = pdb.gimp_image_merge_visible_layers(im, 0)
        # Montar parte do nome do arquivo de saída
        nomArqSaida = "%s%d.png" % (nome, i)
        # Montar o nome completo do arquivo de saída
        nomCompleto = os.path.join(dirSaida, nomArqSaida)
        # Salvar o arquivo com extensão PNG
        pdb.file_png_save_defaults(im, merged, nomCompleto, nomCompleto)

register(
    "gennumero",
    "Gerador de números para uma template",
    "Gerador de números de template",
    "Original: Roman Hwang",
    "Adaptado: Fernando Anselmo",
    "Maio de 2013",
    "/Filters/Fernando/Gerar Número...", "",
    [
        (PF_FILE,   "arg0", "Arquivo Template", ""),
        (PF_INT,    "arg1", "Primeiro número da sequência", 1),
        (PF_INT,    "arg2", "Total de imagens a gerar", 30),
        (PF_STRING, "arg3", "Nome dos arquivos de saída", ""),
        (PF_STRING, "arg4", "Diretório de saída (relativo a pasta USER)", ""),
        (PF_INT,    "arg5", "Tamanho mínimo do número (completa com zeros)", 1),
    ], [], run)

main()
Coloquei todos os comentários necessários para que o Script seja auto entendível, mas qualquer dúvida recomendo a consulta do texto original, outro detalhe é que modifiquei um pouco a programação deste.

Para instalar o plug-in, copie todo o código para seu editor de códigos favorito (não vale o Word/Write) e salve-o com o nome de "icon_generator.py" na pasta /gimp-2.8/plug-ins (esse número 2.8 é a versão do Gimp). Agora é só abrir o Gimp e acessar o caminho "Filters | Fernando" que estará disponível para uso.

Obrigado e até a próxima
Fernando Anselmo

PS. Toda a documentação sobre a geração do Python com Gimp pode ser obtida aqui.

Um comentário:

  1. Grande mestre Fernando, parabéns pelo artigo. Como sugestão, poderia acrescentar uma imagem do resultado do script ? Abraços.

    ResponderExcluir