ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [두근두근 파이썬 12장] 실습 11주차
    학교 수업/1-1, 1-2 코딩 기초 (파이썬, C) 2020. 5. 29. 18:05
    반응형

    컴퓨팅적 사고와 문제 해결 5월 26 실습과제(두근두근파이썬 12장 도전문제)

     

     

    도전문제 1(흑백 사진으로 만들기)

    from PIL import Image, ImageTk, ImageFilter, ImageDraw
    import tkinter as tk
    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)
        canvas.create_image(250,250,image=tk_img)
        window.update()
    
    #프로그램 종료
    def quit():
        window.quit()
    
    #흑백화면으로 변환
    def image_convert_bw():
        global im, tk_img
        out = im.convert('L')
        tk_img = ImageTk.PhotoImage(out)
        canvas.create_image(250,250,image=tk_img)
        window.update()
    
    window = tk.Tk()
    canvas = tk.Canvas(window, width = 500, height = 500)
    canvas.pack()
    
    menubar = tk.Menu(window)
    filemenu = tk.Menu(window)
    ipmenu = tk.Menu(window)
    filemenu.add_command(label = "열기",command = open)
    filemenu.add_command(label = "종료",command = quit)
    ipmenu.add_command(label = "흑백화면으로 전환", command=image_convert_bw)
    menubar.add_cascade(label = "파일", menu = filemenu)
    menubar.add_cascade(label = "영상처리", menu = ipmenu)
    
    window.config(menu = menubar)
    window.mainloop()
    

     

     

     

     

     

     

    도전문제 2(미니 포토샵 - 5가지 영상 처리 기능 만들기)

     

    -엣지 강조 필터

    -텍스트 상자 만들기

    -사진 잘라내기

    -특정한 색깔을 다른 색깔로 변환하기

    -두 사진 합치기

     

    from PIL import Image, ImageTk, ImageFilter, ImageDraw
    import tkinter as tk
    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)
        canvas.create_image(250,250,image=tk_img)
        window.update()
    
    #프로그램 종료
    def quit():
        window.destroy()
    
    #엣지 강조 필터
    def edge_enhancement():
        global im, tk_img
        out = im.filter(ImageFilter.EDGE_ENHANCE)
        tk_img = ImageTk.PhotoImage(out)
        canvas.create_image(250,250,image=tk_img)
        window.update()
    
    #텍스트 상자 추가
    def add_textbox():
        def text():
            global im, tk_img
            x, y = int(e1.get()),int(e2.get())
            t = e3.get()
            
            out = im
            draw = ImageDraw.Draw(out)
    
            draw.text((x,y), text = t)
            tk_img = ImageTk.PhotoImage(out)
            canvas.create_image(250,250,image=tk_img)
            window.update()
        
        def new_quit():
            newWindow.destroy()
        newWindow = tk.Toplevel(window)
        newWindow.geometry("250x130")
    
        l1 = tk.Label(newWindow, text="x좌표: ",width=8)
        l2 = tk.Label(newWindow, text="y좌표: ",width=8)
        l3 = tk.Label(newWindow, text="상자에 적을 내용을 입력하세요.")
        e1 = tk.Entry(newWindow)
        e2 = tk.Entry(newWindow)
        e3 = tk.Entry(newWindow)
        e4 = tk.Entry(newWindow)
        b1 = tk.Button(newWindow, text="확인", command = lambda: [text(),new_quit()])
    
        l1.grid(row=0,column=0)
        l2.grid(row=1,column=0)
        l3.grid(row=2,column=0,columnspan=2)
        e1.grid(row=0,column=1)
        e2.grid(row=1,column=1)
        e3.grid(row=3,column=0,columnspan=2)
        b1.grid(row=4,column=0,columnspan=2)
    
        
    
    #사진 잘라내기
    def create_cut_window():
        def image_cut():
            global im, tk_img
            x1,y1,x2,y2 = int(e1.get()),int(e2.get()),int(e3.get()),int(e4.get())
            out = im.crop((x1,y1,x1+x2,y1+y2))
            tk_img = ImageTk.PhotoImage(out)
            canvas.create_image(250,250,image=tk_img)
            window.update()
        def new_quit():
            newWindow.destroy()
        newWindow = tk.Toplevel(window)
    
        l1 = tk.Label(newWindow, text="x좌표")
        l2 = tk.Label(newWindow, text="y좌표")
        l3 = tk.Label(newWindow, text="가로 길이")
        l4 = tk.Label(newWindow, text="세로 길이")
        l1.grid(row=0, column=0)
        l2.grid(row=0, column=1)
        l3.grid(row=0, column=2)
        l4.grid(row=0, column=3)
    
        e1 = tk.Entry(newWindow)
        e2 = tk.Entry(newWindow)
        e3 = tk.Entry(newWindow)
        e4 = tk.Entry(newWindow)
        e1.grid(row=1,column=0)
        e2.grid(row=1,column=1)
        e3.grid(row=1,column=2)
        e4.grid(row=1,column=3)
    
        b1 = tk.Button(newWindow, text="확인",command = lambda: [image_cut(),new_quit()])
        b1.grid(row=2,column=0, columnspan=4)
    
    #특정색을 다른 색으로 바꾸기
    def change_another_color():
        def change_color():
            global im, tk_img
            x, y = e1.get(), e2.get()
            x1,x2,x3 = int(x[1:3],16),int(x[3:5],16),int(x[5:7],16)
            y1,y2,y3 = int(y[1:3],16),int(y[3:5],16),int(y[5:7],16)
            out = im
            width, height = out.size
            for i in range(width):
                for j in range(height):
                    if out.getpixel((i,j)) == (x1,x2,x3):
                        out.putpixel((i,j),(y1,y2,y3))
            tk_img = ImageTk.PhotoImage(out)
            canvas.create_image(250,250,image=tk_img)
            window.update()
        def new_quit():
            newWindow.destroy()
        newWindow = tk.Toplevel(window)
        l1 = tk.Label(newWindow, text="Hex 코드를 입력하세요.")
        l2 = tk.Label(newWindow, text="→")
        e1 = tk.Entry(newWindow)
        e2 = tk.Entry(newWindow)
        b1 = tk.Button(newWindow, text="변경", command = lambda: [change_color(),new_quit()])
    
        l1.grid(row=0,column=0, columnspan=3)
        l2.grid(row=1,column=1)
        e1.grid(row=1,column=0)
        e2.grid(row=1,column=2)
        b1.grid(row=2,column=0, columnspan=3)
    
    #두 사진 합치기
    def composition_photo():
        def composition():
            global im,tk_img
            im_2 = Image.open(fd.askopenfilename()).resize(im.size)
            mask = Image.new("L", im.size,0)
            draw = ImageDraw.Draw(mask)
            
            x1,y1,x2,y2 = int(e1.get()),int(e2.get()),int(e3.get()),int(e4.get())
            if RadioVar.get() == 1:
                draw.ellipse((x1,y1,x1+x2,y1+y2), fill=255)
            else:
                draw.rectangle((x1,y1,x1+x2,y1+y2), fill=255)
            out = Image.composite(im_2, im, mask)
            tk_img = ImageTk.PhotoImage(out)
            canvas.create_image(250,250,image=tk_img)
            window.update()
        def new_quit():
            newWindow.destroy()
                
        newWindow = tk.Toplevel(window)
        newWindow.geometry("300x150")
        RadioVar = tk.IntVar()
    
        r1 = tk.Radiobutton(newWindow,text="원", variable = RadioVar, value = 1)
        r2 = tk.Radiobutton(newWindow,text="사각형",variable = RadioVar, value = 2)
        r1.grid(row=1,column=0)
        r2.grid(row=1,column=1)
    
        l1 = tk.Label(newWindow,text="좌표를 입력해주세요")
        l2 = tk.Label(newWindow,text="x 좌표: ", width = 5)
        l3 = tk.Label(newWindow,text="y 좌표: ", width = 5)
        l4 = tk.Label(newWindow,text="길이를 입력해주세요")
        l5 = tk.Label(newWindow,text="가로 길이: ", width = 8)
        l6 = tk.Label(newWindow,text="세로 길이: ", width = 8)
    
        e1 = tk.Entry(newWindow, width = 10)
        e2 = tk.Entry(newWindow, width = 10)
        e3 = tk.Entry(newWindow, width = 10)
        e4 = tk.Entry(newWindow, width = 10)
        l1.grid(row=2,column=0,columnspan=4)
        l2.grid(row=3,column=0)
        l3.grid(row=3,column=2)
        l4.grid(row=4,column=0,columnspan=4)
        l5.grid(row=5,column=0)
        l6.grid(row=5,column=2)
        e1.grid(row=3,column=1)
        e2.grid(row=3,column=3)
        e3.grid(row=5,column=1)
        e4.grid(row=5,column=3)
        
        b1 = tk.Button(newWindow, text="확인", command = lambda: [composition(),new_quit()])
        b1.grid(row=8,column=0,columnspan=4)
    
    window = tk.Tk()
    canvas = tk.Canvas(window, width = 500, height = 500)
    canvas.pack()
    
    menubar = tk.Menu(window)
    filemenu = tk.Menu(window)
    ipmenu = tk.Menu(window)
    resmenu = tk.Menu(window)
    
    filemenu.add_command(label = "열기",command = open)
    filemenu.add_command(label = "종료",command = quit)
    ipmenu.add_command(label = "엣지 강조 필터 적용", command=edge_enhancement)
    ipmenu.add_command(label = "텍스트 상자 만들기", command=add_textbox)
    ipmenu.add_command(label = "화면 잘라내기", command = create_cut_window)
    ipmenu.add_command(label = "특정 색깔 바꾸기", command = change_another_color)
    ipmenu.add_command(label = "사진 합치기", command = composition_photo)
    menubar.add_cascade(label = "파일", menu = filemenu)
    menubar.add_cascade(label = "영상처리", menu = ipmenu)
    
    window.config(menu = menubar)
    window.mainloop()
    
    반응형

    댓글

Designed by Tistory.