Olá pessoal, neste tutorial, iremos criar um compressor de imagem em python.

O aplicativo nos permitirá redimensionar o tamanho de uma imagem sem perder qualidade, e esse aplicativo pode ser muito útil para pessoas que desejam alterar a largura e a altura de uma imagem sem perder a qualidade da imagem.

E, como sempre, vou criar esse aplicativo para aprimorar nosso conhecimento e trabalhar com python.

Aqui vamos usar o Tkinter para a parte gráfica ou melhor para o front-end.

 

Criando a Interface gráfica (front-end)

 

Exatamente como havia dito usaremos o Tkinter para a parte visual:

Crie um novo ficheiro em python e nomeia-o como bem entenderes, o meu eu nomeiarei de imagen.py e salve o usando a extensão de ficheiro python
Em seguida, importe a biblioteca tkinter e crie uma janela vazia com tkinter. Eu defini algumas cores que usarei neste projeto.

 

from tkinter import *

################# definir algumas cores ###############
co0 = "#000000"  # black
co1 = "#59656F"
co2 = "#feffff"  # white
co3 = "#0074eb"  # blue
co5 = "#59b356"  # green

###### criar a janela principal do aplicativo ######
janela = Tk()
# para evitar que o tamanho da janela seja alterado
janela.resizable(width=FALSE, height=FALSE)
janela.geometry('400x250')
janela.title('Compressor de imagem')
janela.configure(background=co2)

janela.mainloop()


Em seguida, criaremos um frame onde iremos colocar o label que irá mostrar o nome da nossa aplicação, e este frame será colocada na  janela principal da nossa aplicação.

A idéia é dividir e colocar todos os novos itens dentro deste frame para podermos ter um controle melhor da nossa arquitetura.

Aqui, usaremos o gerente de posição de grid, com o qual é mais fácil obter o resultado que queremos alcançar.

 

############ criando um frame ###########
framecima = Frame(janela, width=400, height=250, bg=co2, relief="flat",)
framecima.grid(row=0, column=0, sticky=NSEW)

#########adicionando um label que será exibido o nome do aplicativo #######
app_name = Label(framecima,text="Compressor de imagem",width=24, height=1, pady=7,padx=10,relief="flat",anchor=CENTER,font=('Courier 20 bold'),bg=co2, fg=co0)
app_name.grid(row=0, column=0, columnspan=2, sticky=NSEW, pady=1)

 

Em seguida, criaremos um um botão que nos permitirá adicionarmos a imagem que desejamos converter.

 

############# criar botão para o novo arquivo ##############
b_novo = Button(framecima, text="+ Novo", width=10, height=1, bg=co3,fg="white", font="5", anchor="center", relief=RAISED)
b_novo.grid(row=1, column=0, columnspan=2, sticky=NSEW, pady=1)

 

Temos tudo certo até aqui, agora iremos criar duas caixas de entrada para inserir os valores desejados de altura e largura, e também iremos adicionar alguns labels por cima deles e juntamente com um botão que irá performar acção desejada.
 

############ Criando alguns Labes ##############
nova_altura = Label(framecima, text="Digite nova altura", width=10, height=1, pady=7,
padx=10, relief="flat", anchor=CENTER, font=('Courier 9 bold'), bg=co2, fg=co0)
nova_altura.grid(row=3, column=0, sticky=NSEW, pady=5)
nova_largura = Label(framecima, text="Digite nova largura", width=10, height=1, pady=7,padx=10, relief="flat", anchor=CENTER, font=('Courier 9 bold'), bg=co2, fg=co0)
nova_largura.grid(row=3, column=1, sticky=NSEW, pady=5)

entrada_altura = Entry(framecima, width=9, justify='center')
entrada_altura.grid(row=4, column=0, sticky=NSEW, pady=5)
entrada_largura = Entry(framecima, width=9, justify='center')
entrada_largura.grid(row=4, column=1, sticky=NSEW, pady=5)

################# Botão Converter ##############
button_convert = Button(framecima, text="Converter", width=10, height=1, bg=co5,
fg="white", font="5", anchor="center", relief=RAISED)
button_convert.grid(row=5, column=0, columnspan=2, pady=5)

 

Até agora, temos tudo certo e nossa interface gráfica já está completa.

Agora vamos instalar a biblioteca Pillow

Pillow é uma biblioteca adicional gratuita e de código aberto para a linguagem de programação Python que adiciona suporte para abrir, manipular e salvar muitos formatos diferentes de arquivos de imagem. Está disponível para Windows, Mac OS X e Linux.

Vai no seu terminal e instale e digita: pip install Pillow e a biblioteca pillow será instalada.

Depois de instalar a biblioteca pillow, vamos importar mais uma funcionalidade do tkinter que nos permite abrir arquivos, assim teremos:

 

from tkinter.filedialog import *

 

E também importa o pillow

from PIL import Image

 

Depois disso, vamos pegar nossa imagem que queremos converter, escrevendo o seguinte:

#Abre uma imagem
ficheiro = askopenfilename()
img = Image.open(ficheiro)

#Tamanho da imagem em pixels (tamanho da imagem original)
img_altura, img_largura = img.size

 

Se você salvar e executar esse código, ele solicitará que você escolha um arquivo.

Para evitar que o código seja executado sozinho, sem que o desejemos, colocaremos esse código dentro de uma função.
Iremos criar uma função e chamaremos ela de novoArquivo.

 

# para abrir um novo arquivo
def novoArquivo():
    # Abre uma imagem
    ficheiro = askopenfilename()
    img = Image.open(ficheiro)
    # Tamanho da imagem em pixels (tamanho da imagem original)
    img_altura, img_largura = img.size


As variáveis   img_altura, img_largura contém o tamanho de altura e largura original da imagem anterior, e nós gostaríamos que elas sejam apresentadas na nossa tela depois de termos selecionado o arquivo, então teremos:

Iremos criar um Label, e depois iremos passar os valores nele.

 

tamanho_antigo = Label(framecima, text="A altura e largura antigas eram " + str(img_altura) + "x" + str(img_largura), width=24, height=1, pady=7,padx=10, relief="flat", anchor=CENTER, font=('Courier  13 bold'), bg=co2, fg=co3)
tamanho_antigo.grid(row=2, column=0, columnspan=2, sticky=NSEW, pady=1)

 

Agora, se executarmos nosso script, ele não nos pedirá mais para escolher um arquivo.

Agora queremos que, quando ele executar o script, a opção de entrada de altura e largura, bem como a conversão do botão, não seja apresentada, porque não faz sentido que eles apareçam sem que tenhamos previamente selecionado um arquivo a ser convertido, Para isso , vamos simplesmente passar também eles dentro da função que acabamos de criar.


Até agora, nosso aplicativo está funcionando da maneira que queremos. para selecionar o arquivo que desejamos, passaremos a função que acabamos de criar, na forma de um evento para este botão, e sempre que você clicar nesse botão, ele solicitará que você selecione um arquivo. e depois salvamos e executamos o script.

Agora que obtivemos nossa imagem, precisamos apenas convertê-la para a altura e o tamanho desejados. Para isso, usaremos recursos da biblioteca Pillow, que serão assim:

 

# função para converter
 def converter():
     # obtendo os valores das entradas de altura e largura
     altura = int(entrada_altura.get())
     largura = int(entrada_largura.get())

     # Definindo novas dimensões para a imagem
     novo_tamanho = (altura, largura)
     nova_img = img.resize((novo_tamanho), Image.ANTIALIAS)
     img_salvar = asksaveasfilename()
     nova_img.save(img_salvar + ".JPG")

 

Agora que terminamos de escrever nosso script que faz essa conversão, passaremos essa função para o botão converter e, toda vez que clicarmos nele, ele realizará a conversão da imagem e solicitará que a imagem seja salva em um local e nosso aplicativo estará pronto.

E gostaríamos também que, após a conversa, ela retorne ao estado inicial; para isso, simplesmente destruiremos todos os widgets presentes nesse quadro, portanto teremos.

Além disso, gostaríamos que, após a conversa, o aplicativo nos notifique que a conversa terminou, para isso usaremos os recursos do tkinter de mensagens que serão.

Nosso aplicativo está finalmente concluído.