Nesse laboratório vamos usar numpy
para adicionar imagens e
filtros no editor de figuras que vimos em sala. Use como
base a versão Tkinter do editor, que está nesse arquivo.
A classe Tkinter.PhotoImage
representa uma imagem que pode ser
mostrada pelos controles do Tkinter (dentro de um canvas, por exemplo).
O construtor dela recebe um nome (uma string) e um dicionário de
opções, duas das quais são "width"
, para a largura da imagem, e
"height"
, para altura. Por exemplo Tkinter.PhotoImage(None, {"width": 300, "height": 200})
cria uma imagem em branco com 300 pixels de largura e 200 de altura.
O método put
das instâncias de PhotoImage
permite pintar os
pixels da imagem. O primeiro argumento é a cor (no formato das cores
do Tkinter) e o segundo é a coordenada (um par com a coordenada x e a y).
Por exemplo, im1.put("#ff0000", (200, 100))
pinta o pixel na coordenada
(200, 100)
de vermelho.
1. Implemente uma classe derivada de Tkinter.PhotoImage
chamada
Imagem
. O construtor dela recebe uma imagem do numpy
(uma matriz
MxNx4), usa M como largura da PhotoImage
, N como altura
da PhotoImage
, e pinta os pixels com as cores que estão na matriz
(use a função cor_tkinter
). Lembre-se que se m
é uma matriz
numpy
então m.shape[0]
é o número de linhas da matriz, m.shape[1]
é o número de colunas, e m[i,j]
dá a quádrupla RGBA do pixel na
coordenada (i,k)
.
2. Para mostrar uma imagem em um canvas do Tkinter usamos o
método create_image
do canvas. Ele recebe as coordenadas de
onde será o centro da imagem, e um dicionário com um atributo "image"
que diz qual instância de PhotoImage
será mostrada:
canvas.create_image(300, 200, { "image": im1 })
. Teste a
classe Imagem
anterior fazendo o canvas do editor mostrar alguma
imagem qualquer em uma posição fixa.
3. Adicone um método imagem(x, y, matriz)
à classe Canvas
para desenhar uma imagem no canvas a partir de uma matriz numpy
com o conteúdo da imagem. As coordenadas são as do canto superior
esquerdo da imagem. Use a classe Imagem
que você criou no
exercício 1, e o método create_image
do canvas.
4. Vamos agora acrescentar uma classe ao modelo do editor que represente
imagens. Crie uma classe FiguraImagem
derivada de FiguraPt
. Seu
construtor recebe as coordenadas do canto superior esquerdo da imagem,
e uma matriz numpy
com o conteúdo da mesma. Implemente os métodos
desenhar
e dentro
para essa classe.
5. Implemente a classe ModoImagem
que representa o modo de desenhar
uma imagem no editor. O construtor de ModoImagem
recebe o modelo
do editor e uma matriz numpy
com o conteúdo da imagem. Os outros
métodos são no molde dos métodos da classe ModoPonto
.
6. Adicione um botão “Imagem” na interface do editor. Quando
clicado, esse botão usa a função tkFileDialog.askopenfilename()
para
pedir que o usuário selecione (essa função retorna o
nome do arquivo selecionado). Use a função matplotlib.pyplot.imread(*nomedoarquivo*)
para ler o arquivo para uma matriz numpy
, e ponha o modelo do editor
no modo de desenho dessa imagem usando a classe ModoImagem
do
exercício anterior.
7. Teste incluir, mover e apagar uma imagem. Se você fez todos exercícios anteriores corretamente todas essas operações devem estar funcionando.
8. Adicione um Rotulo
e uma CaixaEntrada
na interface do editor,
acima dos sliders de escolha de cor, para o usuário poder mudar o gamma
das imagens que são adicionadas. O valor inicial da caixa deve ser 1.0
.
O gamma é um expoente que é aplicado a todos os componentes da imagem:
um gamma entre 0 e 1 deixa a imagem mais clara (quanto mais perto de 0 mais
clara), um gama maior do que 1 deixa ela mais escura. Modifique a ação
do botão “Imagem” para levar em conta o valor atual do gamma na hora
de adicionar uma imagem.
Última Atualização: 2016-05-18 10:58