Python과 TKinter를 사용한 그림 응용 프로그램

며칠 전에 저는 Pillow가 Python과 어떻게 작동하는지 테스트했고 마음에 들어서 Pillow와 Tkinter로 작은 응용 프로그램을 작성하기로 결정했습니다.

내가 프로젝트를 시작한 방법에 대한 설명이 있습니다.

프로젝트에서 나는 main.py의 모든 코드를 넣는 pillow_essaies.py 파일을 만듭니다.

main.py에서 프로젝트를 시작합니다.

import tkinter as tk
from tkinter import *

window = Tk()
window.title("Pictures transformer")
window.geometry("900x500+100+100")
window.configure(bg="#e2f9b8")

window.mainloop()




아이콘도 추가합니다. 이를 위해 Pillow를 가져와야 합니다.

from PIL import Image, ImageTk


아이콘을 만듭니다.

# icon
image_icon=ImageTk.PhotoImage(file="images/tulips.jpeg")
window.iconphoto(False, image_icon)




하나의 아이콘이 추가되었습니다. 이제 인터페이스에 이미지를 추가합니다. ImageTk.PhotoImage 에는 resize 메서드가 없기 때문에 순서가 매우 중요합니다.

# logo
image = Image.open("./images/tulips.jpeg")
img1 = image.resize((70, 100), Image.ANTIALIAS)
logo = ImageTk.PhotoImage(img1)
Label(image=logo, bg="#fff").place(x=10, y=10)




텍스트도 추가합니다.

Label(text="Pictures transformer", font="arial 30 bold", fg="#313715", bg="#e2f9b8").place(x=90, y=50)




이제 이미지를 가져올 공간을 만듭니다.

# selected image
selectimage = Frame(width=400, height=400, bg="#d6dee5")
selectimage.place(x=10, y=120)

f = Frame(selectimage, bg="black", width=380, height=320)
f.place(x=10, y=10)

lbl = Label(f, bg="black)
lbl.place(x=0, y=0)




이제 컴퓨터에서 이미지를 가져와야 합니다. 이를 위해 버튼을 만듭니다.

Button(selectimage, text="Select image", width=12, height=2, font="arial 14 bold", command=showimage).place(x=10, y=340)


함수 showimage를 작성해야 합니다. 이를 위해 os 및 filedialog를 가져옵니다.

from tkinter import filedialog
import os



def showimage():
    filename=filedialog.askopenfilename(initialdir=os.getcwd(),
                                        title="Select image file", filetypes=(("PNG file", "*.png"),
                                                                              ("JPG file", "*.jpg"),
                                                                              ("JPEG file", "*.jpeg"),
                                                                              ("ALL file", "*.txt")))
    importedimage = Image.open(filename)
    importedimage = ImageTk.PhotoImage(importedimage)
    lbl.configure(image=importedimage, width=380, height=320)
    lbl.image=importedimage




여기에 몇 가지 필터를 추가하겠습니다. 버튼으로 시작합니다.

# transformation section
transformationsection = Frame(width=440, height=510, bg="#939f5c")
transformationsection.place(x=450, y=10)

Label(transformationsection, text="Filters:", font="arial 20 bold", fg="#fff", bg="#939f5c").place(x=10, y=10)

Button(transformationsection, text="BLUR", width=12, height=2, font="arial 14 bold", command=blurimage).place(x=10,
                                                                                                              y=50)
Button(transformationsection, text="CONTOUR", width=12, height=2, font="arial 14 bold", command=conturimage).place(x=155, y=50)
Button(transformationsection, text="EMBOSS", width=12, height=2, font="arial 14 bold", command=embossimage).place(x=300, y=50)


여기에 몇 가지 기능을 만듭니다.

def blurimage():
    image1 = Image.open(filename)
    bluredimage = image1.filter(ImageFilter.BLUR)
    bluredimage = ImageTk.PhotoImage(bluredimage)
    lbl.configure(image=bluredimage, width=380, height=320)
    lbl.image = bluredimage


그러나 filename이 아직 전역 변수가 아니고 PIL에서 아직 ImageFilter를 가져오지 않았기 때문에 이와 같은 함수는 작동하지 않습니다. 그래서 다음과 같이 합니다.

from PIL import ImageFilter


그리고 glonal과 같은 함수 showimage 파일 이름에서 정의합니다.

 global filename
    filename = filedialog.askopenfilename(initialdir=os.getcwd(),
                                          title="Select image file", filetypes=(("PNG file", "*.png"),
                                                                                ("JPG file", "*.jpg"),
                                                                                ("JPEG file", "*.jpeg"),
                                                                                ("ALL file", "*.txt")))


이제 작동합니다.



다른 기능은 매우 쉽게 생성할 수 있습니다.

def conturimage():
    image2 = Image.open(filename)
    conturedimage = image2.filter(ImageFilter.CONTOUR)
    conturedimage = ImageTk.PhotoImage(conturedimage)
    lbl.configure(image=conturedimage, width=380, height=320)
    lbl.image = conturedimage

def embossimage():
    image3 = Image.open(filename)
    embossedimage = image3.filter(ImageFilter.EMBOSS)
    embossedimage = ImageTk.PhotoImage(embossedimage)
    lbl.configure(image=embossedimage, width=380, height=320)
    lbl.image = embossedimage


필터 컨투어


필터 엠보스



좋습니다. 하지만 모든 변경 사항을 억제하려면 어떻게 해야 합니까?
따라서 선택한 이미지 섹션에서 다시 시작하는 버튼을 만듭니다.

Button(selectimage, text="Restart", width=12, height=2, font="arial 14 bold", command=restartimage).place(x=260, y=340)


그리고 그 기능은 다음과 같습니다.

def restartimage():
    restartedimage = Image.open(filename)
    restartedimage = ImageTk.PhotoImage(restartedimage)
    lbl.configure(image=restartedimage, width=380, height=320)
    lbl.image = restartedimage  


그러나 더 많은 효능이 그 기능이 될 것입니다.

def restartimage():
    lbl.configure(image=importedimage, width=380, height=320)
    lbl.image = importedimage




이제 사진을 회전하여 슬라이더를 만들고 싶습니다.

# rotate section
Label(transformationsection, text="Rotate image:", font="arial 20 bold", fg="#fff", bg="#939f5c").place(x=10, y=100)

rotateimage = Scale(transformationsection, from_=0, to=360, orient=HORIZONTAL, bg="#313715", length=420)
rotateimage.place(x=10, y=140)




그리고 그것과 함께 가는 기능:

def rotate(var):
    image4 = Image.open(filename)
    rotatedimage = image4.rotate(rotateimage.get())
    rotatedimage = ImageTk.PhotoImage(rotatedimage)
    lbl.configure(image=rotatedimage, width=380, height=320)
    lbl.image = rotatedimage




이제 몇 가지 색상을 변경하고 싶기 때문에 각 색상에 대한 세로 슬라이더를 만듭니다.

# color change
Label(transformationsection, text="Color change:", font="arial 20 bold", fg="#fff", bg="#939f5c").place(x=10, y=190)

redimage = Scale(transformationsection, from_=0, to=255, orient=VERTICAL, bg="#313715", length=180, command=changered)
redimage.place(x=40, y=230)
Label(transformationsection, text="RED", font="arial 12 bold", fg="#fff", bg="#939f5c").place(x=40, y=420)

greenimage = Scale(transformationsection, from_=0, to=255, orient=VERTICAL, bg="#313715", length=180, command=changegreen)
greenimage.place(x=200, y=230)
Label(transformationsection, text="GREEN", font="arial 12 bold", fg="#fff", bg="#939f5c").place(x=200, y=420)

blueimage = Scale(transformationsection, from_=0, to=255, orient=VERTICAL, bg="#313715", length=180,  command=changeblue)
blueimage.place(x=350, y=230)
Label(transformationsection, text="BLUE", font="arial 12 bold", fg="#fff", bg="#939f5c").place(x=350, y=420)


그리고 색상을 변경하는 몇 가지 기능을 만듭니다.

def changered(var):
    image5 = Image.open(filename)
    r, g, b = image5.split()
    r = r.point(lambda i: redimage.get())
    coloredimage = Image.merge("RGB", (r, g, b))
    coloredimage.getextrema()
    coloredimage = ImageTk.PhotoImage(coloredimage)
    lbl.configure(image=coloredimage, width=380, height=320)
    lbl.image = coloredimage

def changeblue(var):
    image5 = Image.open(filename)
    r, g, b = image5.split()
    b = b.point(lambda i: blueimage.get())
    coloredimage = Image.merge("RGB", (r, g, b))
    coloredimage.getextrema()
    coloredimage = ImageTk.PhotoImage(coloredimage)
    lbl.configure(image=coloredimage, width=380, height=320)
    lbl.image = coloredimage

def changegreen(var):
    image5 = Image.open(filename)
    r, g, b = image5.split()
    g = g.point(lambda i: greenimage.get())
    coloredimage = Image.merge("RGB", (r, g, b))
    coloredimage.getextrema()
    coloredimage = ImageTk.PhotoImage(coloredimage)
    lbl.configure(image=coloredimage, width=380, height=320)
    lbl.image = coloredimage


Voilà 결과:



이 작은 애플리케이션의 모든 코드를 찾을 수 있습니다here.

이것은 Pillow와 Tkinter를 사용하는 방법의 예입니다.
주말 잘 보내시고 푹 쉬세요.

좋은 웹페이지 즐겨찾기