Mundo em Python

Converter para desenho a lápis

from tkinter import *
from tkinter import Tk, ttk, filedialog
from PIL import ImageTk, Image, ImageEnhance
import cv2
import os co0 = "#f0f3f5" # Preto
co1 = "#feffff" # Branco
co2 = "#4fa882" # Verde
co3 = "#38576b" # Valor
co4 = "#403d3d" # Letra
co5 = "#e06636" # Profit
co6 = "#038cfc" # Azul

root = Tk()
root.title("Converter para desenho a lápis")
root.geometry("450x550")
root.config(bg=co1)
root.resizable(width=False, height=False) # Variáveis globais
global imagem_original, imagem_convertida, caminho_imagem
imagem_original = None
imagem_convertida = None
caminho_imagem = ""

# Função para escolher a imagem
def escolher_imagem():
global imagem_original, caminho_imagem
caminho_imagem = filedialog.askopenfilename(filetypes=[("Imagens", "*.png;*.jpg;*.jpeg")])
if caminho_imagem:
imagem_original = Image.open(caminho_imagem)
imagem_preview = imagem_original.resize((200, 200))
imagem_preview = ImageTk.PhotoImage(imagem_preview)
l_preview_original.configure(image=imagem_preview)
l_preview_original.image = imagem_preview # Função para converter a imagem
def converter_imagem(event=None):
global imagem_original, imagem_convertida, caminho_imagem
if imagem_original is None or not caminho_imagem:
return

# Tentar carregar a imagem no OpenCV
imagem_cv = cv2.imread(caminho_imagem, cv2.IMREAD_GRAYSCALE) # Verificar se a imagem foi carregada corretamente
if imagem_cv is None:
print("Erro: Não foi possível carregar a imagem.")
return

r = s_intensidade.get()
brilho = s_Brilho.get() / 100
contraste = s_contraste.get() / 100

# Aplicar efeito de desenho a lápis
blur = cv2.GaussianBlur(imagem_cv, (21, 21), 0)
sketch = cv2.divide(imagem_cv, blur, scale=r) # Converter para PIL
pil_sketch = Image.fromarray(sketch)
enhancer_brilho = ImageEnhance.Brightness(pil_sketch)
pil_sketch = enhancer_brilho.enhance(brilho)
enhancer_contraste = ImageEnhance.Contrast(pil_sketch)
pil_sketch = enhancer_contraste.enhance(contraste) imagem_convertida = pil_sketch
imagem_preview = imagem_convertida.resize((200, 200))
imagem_preview = ImageTk.PhotoImage(imagem_preview)
l_preview_convertida.configure(image=imagem_preview)
l_preview_convertida.image = imagem_preview # Função para salvar a imagem convertida
def salvar_imagem():
global imagem_convertida
if imagem_convertida:
caminho_salvar = filedialog.asksaveasfilename(defaultextension=".png", filetypes=[("PNG", "*.png"), ("JPEG", "*.jpg")])
if caminho_salvar:
imagem_convertida.save(caminho_salvar) # Frames
frame_top = Frame(root, width=450, height=50, bg=co1)
frame_top.grid(row=0, column=0, padx=10, pady=5) frame_previw = Frame(root, width=450, height=220, bg=co1)
frame_previw.grid(row=1, column=0, padx=10, pady=5) frame_controls = Frame(root, width=450, height=220, bg=co3)
frame_controls.grid(row=2, column=0, padx=10, pady=5) # Título
titulo = Label(frame_top, text="Converter para desenho a lápis", font=("Arial", "16", "bold"), bg=co1, fg=co4)
titulo.pack() # Labels de preview
l_preview_original = Label(frame_previw, text="Foto Original", font=("Arial", "12"), bg=co1, fg=co3)
l_preview_original.place(x=30, y=10) l_preview_convertida = Label(frame_previw, text="Foto Convertida", font=("Arial", "12"), bg=co1, fg=co3)
l_preview_convertida.place(x=240, y=10) # Controles
ttk.Label(frame_controls, text="Intensidade", background=co1).place(x=10, y=10)
s_intensidade = Scale(frame_controls, from_=50, to=300, orient=HORIZONTAL, length=200)
s_intensidade.set(120)
s_intensidade.place(x=10, y=30) ttk.Label(frame_controls, text="Brilho", background=co1).place(x=10, y=80)
s_Brilho = Scale(frame_controls, from_=50, to=300, orient=HORIZONTAL, length=200)
s_Brilho.set(120)
s_Brilho.place(x=10, y=100) ttk.Label(frame_controls, text="Contraste", background=co1).place(x=10, y=150)
s_contraste = Scale(frame_controls, from_=50, to=300, orient=HORIZONTAL, length=200)
s_contraste.set(120)
s_contraste.place(x=10, y=170) # Botões
b_escolher = Button(root, command=escolher_imagem, text="Escolher Imagem", bg=co6, fg=co1, font=("Arial", 10), width=15)
b_escolher.place(x=20, y=500) b_Converter = Button(root, command=converter_imagem, text="Converter Imagem", bg=co2, fg=co1, font=("Arial", 10), width=15)
b_Converter.place(x=160, y=500) b_salvar = Button(root, command=salvar_imagem, text="Salvar Imagem", bg=co5, fg=co1, font=("Arial", 10), width=15)
b_salvar.place(x=300, y=500) root.mainloop()
0