O Python Imaging Library (PIL) é uma biblioteca Python para que você possa escrever programas que abram e manipule imagens de maneira simples e ao mesmo tempo poderosa.

Se você está usando Python como alternativa ao PHP, vai querer usar o PIL como alternativa à GD.

Vou mostrar aqui as principais funções da PIL.

Angelina Jolie segurando a cobra
angie.jpg, Angelina Jolie e a Python

Nos exemplos eu vou usar essa foto acima, angie.jpg.

Abrindo uma imagem

O primeiro código abre uma imagem, diz a largura e altura da imagem e o modo de indexação das cores.

import Image
im = Image.open("angie.jpg")
print im.size, im.mode

Isso vai retornar:

(389, 410) RGB

Ou seja, a largura é de 389 pixels, a altura é de 410 pixels. O formatura de indexação das cores é RGB.

Miniatura

Agora vamos abrir a imagem e fazer uma miniatura de tamanho 128×128 com nome miniatura_angie.jpg.

import Image
im = Image.open("angie.jpg")
im.thumbnail((128,128))
im.save("miniatura_angie.jpg")

Isso vai gerar essa imagem:

Miniatura de angie.jpg
miniatura_angie.jpg

Miniatura com antialiasing

Podemos fazer a mesma miniatura usando suavização (Antialias):

import Image
tamanho = 128,128
nome = "angie.jpg"
im = Image.open(nome)
im.thumbnail(tamanho, Image.ANTIALIAS)
im.save("miniatura_"+nome)

Miniatura de angie.jpg
miniatura_angie.jpg com suavização

A diferença é sensível:

Miniatura de angie.jpg Miniatura de angie.jpg
A da esquerda é sem antialias, a da direita é com

Converter um BMP para JPEG

Basta abrir o arquivo e depois salvar ele com codificação JPG. No caso, vamos abrir uma imagem chamada flor.bmp e salva-la como flor.jpg.

import Image
im = Image.open("flor.bmp")
im.save("flor.jpg", "JPEG")

Convertendo um monte de arquivos para JPG
Agora suponha que você tenha um diretório cheio de arquivos bmp e quer passar tudo para jpg de uma só vez.

import os
import Image

cwd = os.getcwd()
for arquivo in os.listdir(cwd):
   if arquivo.endswith('.bmp'):
      im = Image.open(arquivo)
      nome = arquivo.split('.')[0]
      im.save(nome+".jpg", "JPEG")

A função getcwd do módulo os nos fornece o diretório de onde o programa foi chamado, guardamos isso em cwd. Para todo arquivo naquele diretório nos, testamos se ele termina com .bmp. Se sim, nos abrimos ele, pegamos a parte do nome que vem antes do .bmp e salvamos ele com a extensão .jpg. Eu já falei sobre o método split num post anterior.

O mesmo raciocínio desse programa pode ser empregado para se criar, por exemplo, miniaturas de todos os arquivos de um diretório.

Rotacionando uma imagem

import Image

img = Image.open("miniatura_angie.jpg")
img2 = img.rotate(45)
img3 = img.rotate(60)
img4 = img.rotate(90)

img2.save("angie_45.jpg")
img3.save("angie_60.jpg")
img4.save("angie_90.jpg")

A miniatura seguida dos arquivos angie_45, angie_60 e angie_90:

Miniatura de angie.jpg angie_45.jpg angie_60.jpg angie_90.jpg

Escrevendo um texto na imagem

O Image tem vários sub módulos, um para cada classe de funcionalidade. O ImageDraw provê desenho de primitivas e de texto. Aqui eu uso a fonte padrão do Image, para mais fontes e tamanhos você deve ver o ImageFont.

import Image
import ImageDraw

img = Image.open("angie.jpg")
draw = ImageDraw.Draw(img)
texto = "www.eupodiatamatando.com"
pos = 50,50
draw.text(pos, texto)
img.save("angie_com_texto.jpg")

Nós abrimos uma imagem, instânciamos um Draw daquela imagem e colocamos um texto na posição 50,50, a contar do canto superior esquerdo da imagem.

Angie com texto
Aplicação de texto sobre imagem

Operações pixel a pixel

Vou abrir a imagem da Angelina, fazer dela uma miniatura de 128×128 e aplicar algumas funções.
A imagem tem um método point, onde você pode passar uma função para ser aplicada em todos os pontos. Vamos criar funções de uma linha usando o lambda.

import Image

angie = Image.open("angie.jpg")
angie.load()
angie.thumbnail((128,128))
img2 = angie.point(lambda i: i * 2.0)
img3 = angie.point(lambda i: i < 100 and 255)
img4 = angie.point(lambda i: i * 0.5)
img5 = angie.point(lambda i: i**2)
img2.save("angie2.jpg")
img3.save("angie3.jpg")
img4.save("angie4.jpg")
img5.save("angie5.jpg")

A miniatura original seguida dos 4 resultados:

Miniatura de angie.jpg angie2.jpg angie3.jpg angie4.jpg angie5.jpg

Bem, dá pra fazer muito mais com o PIL. Dê uma olhada no tutorial oficial ou no Handbook para conhecer os outros módulos.

Instalação no Linux
Procure o pacote python-imaging. Em geral:

apt-get install python-imaging

Instalação no Windows
Há um instalador EXE aqui. Antes de baixar verifique a versão do seu Python.

Livros PythonUma ótima maneira de aprender mais são com livros de Como Programar em Python pelos menores preços que você encontra no Buscapé.