Ver Feed RSS

root@blog:/# chmod o+r *

Brincando com Python e PIL

Avalie este Post de Blog
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...

Atualizado 20-01-2010 em 08:03 por Magnun

Categorias
internet , Dicas , Python

Comentários

  1. Avatar de fernandesrj
    Meu caro, baixei o pacote PIL mas ao testar

    >>>import Image
    >>>a=Image.open("surf.jpeg")
    Traceback (most recent call last):
    File "<pyshell#17>", line 1, in <module>
    a=Image.open("surf")
    File "C:\Python26\lib\site-packages\PIL\Image.py", line 1952, in open
    fp = __builtin__.open(fp, "rb")
    IOError: [Errno 2] No such file or directory: 'surf'

    e quando especifico o diretório:

    >>> im=Image.open("C:\algumacoisaalgumacoisa","surf.jpeg")
    Traceback (most recent call last):
    File "<pyshell#15>", line 1, in <module>
    im=Image.open("C:\Users\Fernandes\Pictures\wallpapaer","surf.jpeg")
    File "C:\Python26\lib\site-packages\PIL\Image.py", line 1947, in open
    raise ValueError("bad mode")
    ValueError: bad mode

    o que acha que posso fazer?
  2. Avatar de Magnun
    Olá fernandesrj,

    Prmeiramente, para usar o a=Image.open("surf.jpeg") seu programa precisa estar na mesma pasta que a imagem surf.jpeg. Caso não esteja, vc deve informar o caminho completo:
    a=Image.open("c:\\algum\\diretorio\\surf.jpeg")

    As duas barras são necessárias pois a barra para a esquerda é utilizada como caractere de escape para alguns caracteres especiais como o \n (enter), \t (tab) e \r(carriage return)

+ Enviar Comentário