Assine nossos feeds Siga nosso Twitter Adicione no Facebook Adicione no Linkedin
Visite também: BR-Linux ·  VivaOLinux ·  LinuxSecurity ·  Dicas-L ·  NoticiasLinux ·  SoftwareLivre.org ·  [mais]

Ver Feed RSS

root@blog:/# chmod o+r *

Brincando com Python e PIL

Avalie este Post de Blog
por em 14-01-2009 às 11:59 (2553 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:

+ +

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","jpe g")



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...

Enviar "Brincando com Python e PIL" para Digg Enviar "Brincando com Python e PIL" para del.icio.us Enviar "Brincando com Python e PIL" para StumbleUpon Enviar "Brincando com Python e PIL" para Google

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

Categorias
internet , Dicas , Python

Comentários

  1. fernandesrj -
    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:\algumacoisaa lgumacoisa","surf.jpeg")
    Traceback (most recent call last):
    File "<pyshell#15>", line 1, in <module>
    im=Image.open("C:\Users\Fernan des\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. Magnun -
    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\\diret orio\\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)
Comentar Comentar

Trackbacks

Total de Trackbacks 0
URL do Trackback: