Brincando com Python e PIL
por
em 14-01-2009 às 11:59 (12488 Visualizações)
Outro dia enquanto eu estudava e vagava pela internet me deparei com essa thread no Ubuntu Forum. Me lembrei que quando comecei com o CoverSync (meu plugin pra Exaile) eu tinha previsto uma função de gerar Metafiles XML para alterar o ícone das pastas do Nautilus. O Avatar-Factory faz mais ou menos isso... Só que ele gera entradas .desktop. Mas em uma coisa ele ia me ajuda: Customizar as imagens.
Abri o código fonte dele mas nem olhei muita coisa... Sou meio ruim em shell script! Preferi procurar algo nativo de Python. Então encontrei o Módulo PIL (Python Image Library). Esse link é a documentação desse módulo. Na parte 1 tem um tutorial, fui direto nele. Não li os primeiros 20 parágrafos e já fui fazer uns testes! E saiu mais ou menos isso aqui:
Legal ne?!
Outra:
Acredite, foi "gerado" por um programa...
Como eu fiz?! E se eu disser que é igual mexer no paint, só que em linha de comando... você acredita? Pois é... A idéia é mais ou menos essa aqui:
http://under-linux.org/members/magnu...0-back-peq.png + http://under-linux.org/members/magnu...o-tourbook.jpg + http://under-linux.org/members/magnu...32-top-peq.png
Temos um fundo, uma capa e um topo. Fazemos um sanduiche colando uma em cima da outra!! Caso não tenha uma capa, colocamos só o topo sobre o fundo e temos uma caixa de CD vazia. O imprescindível aqui é que o fundo e a capa sejam do mesmo tamanho e temos que informar 2 coisas:
- As coordenadas (X,Y) em pixels a partir de onde a capa será colada no fundo.
- O tamanho que a capa deve ter para se "encaixar" no fundo.
Exemplo do código:
import Image
# Abre as imagens
back = Image.open("back.png") #Fundo
top = Image.open("top.png") #Topo
cover = Image.open("cover.png") #Capa
# Se a capa não for 147x147 redimensiona
if cover.size != (147,147): cover = cover.resize((147, 147))
# Cola a capa sobre o fundo
back.paste(cover, (21,3))
# Cola o topo sobre a mescla (fundo + capa)
# Como o topo tem transparência precisa de um detalhe a mais
back.paste(top, (0,0), top)
# Salva tudo como JPG
back.save("thumbnail.jpg","jpeg")
Nesse caso usei um "tamanho útil" de 147x147 a partir do ponto (21,3). A parte boa disso é que a capa pode ter qualquer tamanho, mas no final teremos um tamanho fixo, o tamanho do fundo e topo. Note que na hora de colar o topo tem 2 detalhes: o ponto (0,0) e o terceiro argumento que indica que deve ser usado transparência.
Simples ne?! Python sempre me surpreende!!
Se alguém quiser ver mais algumas que eu fiz é só dar uma olhada nessa issue aberta na página googlecode do CoverSync...
Até mais pessoal...
Comentários
+ Enviar Comentário