Emacs para crianças: Criando scripts para o GIMP

Este artigo irá mostrar como é fácil desenvolver script-fu (scripts em TinyScheme para o GIMP) utilizando Emacs e gimpmode. A primeira coisa, além de possuir o Emcas instalado, é instalar o gimpmode. Aqui eu entrei no diretório ~/.emacs.d/modes, digitei git clone https://github.com/pft/gimpmode.git e pronto. Depois é só executar o arquivo de instalação M-x load-file caminho/gimp-install.el. Depois copie para o arquivo ~/.emacs o necessário para que tudo funcione corretamente. No site do gimpmode existe um arquivo explicando o funcionamento mas, seguinto o vídeo mudo abaixo, é possível ver que é simples. Vou explicar os passos presentes no vídeo mas não detalhadamente. Será necessário seguir os links para aprender um pouco do processo de criação de um script-fu.

Inicialmente é necessário ler o tutorial para a criação de um script-fu. É necessário uma visão da linguagem Scheme (que é um processo bastante simples) e uma visão da estrutura de um script, como é registrado, como são especificados os parâmtros, etc.. Depois uma olhada geral nas funções disponibilizadas pelo GIMP para o usuário. Para tanto, perca um tempinho vendo o nome e a finalidade das funções utilizando o menu Ajuda -> Navegador de procedimentos do GIMP.

Primeiro iniciei o servidor para scripts no GIMP (Filtros->Script-Fu-> Iniciar servidor...) para que o emacs+gimpmode possam se comunicar com o GIMP e facilitar as coisas. Nada impediria que eu escrevesse o script no emacs, gravasse, fosse para o GIMP, recarregasse os scripts e testasse. Existem vantagens e desvantagens de iniciar o servidor pelo GIMP ou iniciar o GIMP como um subprocesso do Emacs, mas vêm ao caso agora. O próximo passo poderia ser iniciar a comunicação entre o gimpmode e o GIMP. É só digitar M-x gimp-cl-connect (eu inverti o processo, o que não prejudica o funcionamento). Depois basta criar ou abrir o arquivo que conterá os scripts. Se o arquivo não existe, você será questionado se gostaria de iniciar com as funções de registro do script e o registro no menu. Você poderá a qualquer tempo digitar reg e enter que o modo irá criar automaticamente as funções para registro. Basta alterar os dados.

Depois de escrever o script, você savá-lo, entrar no GIMP, recarregar, etc.. Pessoalmente acho mais fácil digitar M-x gimp-refresh-scripts ou, para facilitar mais as coisas M-x g-s-c [tab] que o comando será expandido apropriadamente. É interessante já que, se existir alguma alteração no arquivo do script, antes de recarregar os scripts o emacs irá mostrar um prompt para a gravação do arquivo. Depois é só testar o script.

Outra facilidade do modo são os fragmentos que são expandidos automaticamente. Por exemplo, quando necessitamos de um argumento tipo string para a função, é necessário entrar com SF-STRING "opção" "conteúdo". Basta digitar sfs e pressionar enter que o fragmento será expandido para o que se deseja e as partes alteráveis serão selecionadas para facilitar a digitação.

O vídeo mostra o processo de criação e teste de uma função onde o usuário digita um texto e o mesmo é apresentado em uma janela de mensagem e uma função que para inverter uma imagem com a possibilidade de convertê-la para monocromática se for desejado. Também é possível ver qeu podemos ter mais de uma função em um mesmo arquivo.

Por enquanto era isso.

=-=-=-=-=
Powered by Blogilo

Anúncios

Protegendo suas imagens na internet (GIMP)

Um caso comum nos dias de hoje é a utilização de uma imagem sem autorização do autor. Os casos vão desde alguém que pega uma foto e publica um livro até empresas que utilizam as fotos em seus sites sem permissão do autor e sem a inclusão dos créditos (apenas um de inúmeros casos).

O problema não está em utilizar uma foto e sim em desrespeitar uma licença. Mesmo no flickr, é possível atribuir a licença desejada para uma ou mais fotos. Não custa nada quem for utilizar uma foto procurar um dos tantos locais que fornecem fotos gratuitamente ou, como o flickr é um local que possui uma grande quantidade de fotos, procurar por uma foto que satisfaça as necessidades e o autor tenha uma licença mais flexível.

Uma das formas de minimizar a utilização ilegal das fotos é colocar em um site apenas uma imagem pequena (500/600 pixels no lado maior). Assim já se evita que a foto seja impressa em um tamanho maior. Mas a utilização em sites ainda fica bastante fácil.

Muitos colocam uma borda com assinatura. Até pode dificultar um pouco, mas se o pessoal usa cópias ilegais de programas, fica relativamente simples recortar a imagem e deixar a assinatura de fora.

Por último, alguns utilizam a assinatura sobre a fotografia. Pode ser mais eficiente mas, na maioria dos casos, tira a beleza da foto.

A proposta aqui é colocar uma marca d’água invisível que seja de fácil inclusão e visualização, não necessitando de programas especiais. Assim, se alguém utilizar a sua foto ilegalmente, pode ser mais fácil de identificá-la e processar o infrator. Uma graninha extra sempre é bemvinda. E lembre-se que, como a pessoa também está ganhando mais dinheiro por não ter pago para a utilização da sua foto, você não está fazendo nada de mais. Apenas um direito (dever?) seu.

Mas vamos ao que interessa. Veja as duas imagens abaixo.

originalalterada

A imagem superior é a original e a inferior possui uma marca d’água. Inicialmente não é possível notar maiores diferenças. Para ver a marca d’água, basta abrir a imagem original (esquerda), abrir em uma nova camada a imagem alterada (direita) e aplicar Extrair Grão no modo da camada da imagem alterada. Você deverá ter uma imagem assim:

Utilizando Color->Auto->Aumentar Contraste o resultado deverá ficar assim:

O método possui como vantagem a simplicidade e, em muitos casos é possível fazer o teste mesmo se existe apenas uma parte da imagem. Certo. Gostei. Mas diz logo como fazer!

A idéia não é nova. Eu até estava fazendo um tutorial bonitinho, meio estilo tradução. Mas ele estava ficando grande e eu sem muita paciência. Abandonei o tutorial e fiz um script-fu para o GIMP. De qualquer forma, é interessante saber como é o processo.

1. Primeiro deve ser criada uma textura com o fundo transparente e escreve-se um texto com a cor branca, recortar a imagem para não ficar muita borda, etc. Aí é só salvar a imagem na forma apropriada em uma pasta específica. Como o script, basta executar File->Create->Photo Watermark, escrever o texto e clicar em OK. Bem, facilitou tudo. Inclusive você pode alterar a marca d’água quando desejar com a mesma facilidade.

2. Após editar sua imagem, grave como sendo a original (você ira precisar dela para ver a marca d’água no futuro). Crie uma nova camada transparente, preencha com a textura da marca d’agua, Coloque a opacidade bem baixa (3, por exemplo). Com o script, basta executar Filters->Render->Photo Watermark. Mais fácil também né?

A etapa dois requer a intervenção do usuário. Em áreas mais homogêneas da imagem, é possível que mesmo com uma opacidade baixa, seja possível ver a marca d’água. Para tanto, utilize a borracha (pode colocar com uma opacidade de 50) e apague as partes visíveis. Certifique-se de estar trabalhando na camada que possui a marca d’água. Quando o resultado for satisfatório, achate a imagem, grave e coloque no site.

Script
Baixe o script em wm-txt.scm e grave-o no local apropriado.

No Linux em /home/[usuario]/gimp-[ver]/scripts e
no Windows em C:\Documents and Settings\[usuario]\.gimp-[ver]\scripts,
trocando [usuario] é o nome do usuário e [ver] é a versão do GIMP.

O script para quem tiver curiosidade e não quiser baixar.

;;;
;;; Criar uma marca d'agua para ser usada em uma imagem
;;;
(define (sf-wm-create text font size show?)
  (let* ((img (car (gimp-image-new 256 256 RGB)))
         (old-fg (car (gimp-context-get-foreground)))
         (text-layer 0)
         (path (string-append gimp-directory "/patterns/photo-watermak.pat")))
    (gimp-context-set-foreground '(255 255 255))
    (set! text-layer (car (gimp-text-fontname img -1 0 0 text 5 TRUE size PIXELS font)))
    (script-fu-util-image-resize-from-layer img text-layer)
    (file-pat-save RUN-NONINTERACTIVE
		   img 
		   text-layer
		   path 
		   path
		   "Photo Watermark")
    (gimp-patterns-refresh)
    (gimp-context-set-foreground old-fg)
    (if (= show? FALSE)
	(gimp-image-delete img)
	(gimp-display-new img))))

;;;
;;; Aplicar marca d'agua em uma imagem
;;;
(define (sf-wm-apply img drawable)
  (let* ((old-pat (car (gimp-context-get-pattern)))
	 (layer 0)
	 (width (car (gimp-image-width img)))
	 (height (car (gimp-image-height img))))
    (gimp-image-undo-group-start img)
    (set! layer (car (gimp-layer-new img width height RGBA-IMAGE "Watermark" 3 NORMAL-MODE)))
    (gimp-image-add-layer img layer -1)
    (gimp-context-set-pattern "Photo Watermark")
    (gimp-displays-flush img)
    (gimp-selection-all img)
    (gimp-edit-fill layer PATTERN-FILL)
    (gimp-selection-clear img)
    (gimp-context-set-pattern old-pat)
    (gimp-image-undo-group-end img)))

;;;
;;; Registro das funções
;;;
(script-fu-register "sf-wm-create"
                    "Photo Watermark"
                    "Create Watermark"
                    "Guaracy Monteiro "
                    "Guaracy Monteiro"
                    "2009-11-23"
                    ""
		    SF-STRING 	  _"Watermark Text"   "My Watermark"
		    SF-FONT	  _"Font"             "Arial Bold"
		    SF-ADJUSTMENT _"Size (pixels)"    '(18 2 200 1 10 0 1)
		    SF-TOGGLE     _"Display image"    FALSE)

(script-fu-register "sf-wm-apply"
                    "Photo Watermark"
                    "Apply Watermark"
                    "Guaracy Monteiro "
                    "Guaracy Monteiro"
                    "2009-11-23"
                    "RGB*"
		    SF-IMAGE 	  _"Image"     0
		    SF-DRAWABLE   _"Drawable"  0)

(script-fu-menu-register "sf-wm-create"
                          "<image>/File/Create")

(script-fu-menu-register "sf-wm-apply"
                          "<image>/Filters/Render")