Language/Python

두근두근 파이썬 CH10 연습문제

Return 2021. 6. 22. 19:50

1번.

import tkinter as tk
from PIL import Image , ImageTk, ImageFilter
from tkinter import filedialog as fd

im = None  #사용할 변수들 선언
tk_img = None

def open():
    global im , tk_img
    fname = fd.askopenfilename() #클릭했을때 클릭된 파일
    im = Image.open(fname) #파일 연다.
    tk_img = ImageTk.PhotoImage(im) #tk형식에 바꾸어 파일 변환
    canvas.create_image(250,250,image=tk_img) #캔버스에 이미지 그린다.
    window.update() #윈도우 업데이트

def quit():
    window.quit() # 윈도우 종료

def image_rotate():
    global im, tk_img #함수안에서 변수 사용하려면 글로벌 선언 필수
    out = im.rotate(45) #45회전
    tk_img = ImageTk.PhotoImage(out)
    canvas.create_image(250,250,image= tk_img)
    window.update()

def image_blur():
    global im, tk_img
    out1 = im.filter(ImageFilter.BLUR) #filter 클래스 이용하여 이미지 흐리
    tk_img = ImageTk.PhotoImage(out1)
    canvas.create_image(250,250,image= tk_img)
    window.update()

window = tk.Tk()
canvas = tk.Canvas(window , width=500 , height=500)
canvas.pack()

#Menu()를 사용하여 윈도우 안에 메뉴를 생성한다.
menubar = tk.Menu(window)
#메뉴바안에 "파일" 메뉴를 생성한다.
filemenu =tk.Menu(menubar)
#메뉴바안에 "ipmenu" 메뉴를 생성한다.
ipmenu = tk.Menu(menubar)

#파일 메뉴안에 열기,종료 메뉴 항목을 추가한다.
filemenu.add_command(label="열기", command = open)
filemenu.add_command(label="종료",command = quit)
ipmenu.add_command(label = "영상회전",command = image_rotate)
ipmenu.add_command(label = "영상흐리게",command = image_blur)

#파일 메뉴를 누르면 아래로 다른 메뉴가 확장이 되도록한다.
menubar.add_cascade(label = "파일",menu = filemenu)
menubar.add_cascade(label = "영상처리", menu = ipmenu)

window.config(menu = menubar)
window.mainloop()

2번.

from PIL import ImageTk, Image

img = Image.open("image1.gif")
grayscale = img.convert("L")  #img.convert(mode)
grayscale.show()              #img.convert("L"):흑백모드

3번.

import tkinter as tk
from PIL import Image , ImageTk


img= None  #사용할 변수들 선언
tk_img=None
area =()

def save():
    global img
    img.save("test1.jpeg","jpeg") #이미지 저장 파일명, 형식

def cut():
    global img , tk_img , area

    x_start = int(input("자를 x좌표 시작점:"))
    y_start = int(input("자를 y좌표 시작점:"))
    x_range = int(input("자를 x좌표 범위:"))
    y_range = int(input("자를 y좌표 범위:"))

    area = (x_start,y_start,x_range,y_range)
     #튜플 형식으로 사용

    img= img.crop((area)) #crop 클래스 이용하여 잘라낸다.
    tk_img = ImageTk.PhotoImage(img)
    canvas.create_image(250,250,image=tk_img)
    window.update()

def resize():
    global img , tk_img
    size_x = int(input("x축 사이즈는 어떻게 할까요 ?"))
    size_y = int(input("y축 사이즈는 어떻게 할까요? "))

    img = img.resize((size_x,size_y))#resize클래스 사용하여 이미지 크기변환
   tk_img = ImageTk.PhotoImage(img)
    canvas.create_image(250,250,image=tk_img)
    window.update()

window = tk.Tk()

canvas = tk.Canvas(window , width=500 , height= 500)
canvas.pack()

img = Image.open("image1.gif")
tk_img =ImageTk.PhotoImage(img)
canvas.create_image(250,250,image=tk_img)
window.update()

#문제 1번과 동일한 과정

menubar = tk.Menu(window)
filemenu = tk.Menu(menubar)
ipmenu = tk.Menu(menubar)

filemenu.add_command(label="저장",command=save)
ipmenu.add_command(label="잘라내기",command=cut)
ipmenu.add_command(label="리사이즈",command=resize)

menubar.add_cascade(label="파일",menu = filemenu)
menubar.add_cascade(label="영상처리",menu = ipmenu)

window.config(menu = menubar)

window.mainloop()