본문 바로가기
프로그래밍언어/Python

[Python] : 미니 포토샵 프로젝트 (2부)

by 오주현 2021. 11. 10.
반응형

저번에 글애 이어 완성을 하겠습니다.

 

2021.11.10 - [프로그래밍언어/Python] - [Python] : 미니 포토샵 프로젝트 (1부)

 

[Python] : 미니 포토샵 프로젝트 (1부)

미니 포토샵 프로젝트 - 포토샵은 사진에 효과를 주는 대표적인 소프트웨어입니다. - 미니 포토샵은 JPG, BMP, PNG 등 불러오는 기능 뿐만 아니라 이미지를 확대, 축소, 회전시키고 밝기를 처리하는

ohju.tistory.com

 

미니 포토샵 프로젝트
#1.py

from tkinter import *
from tkinter.filedialog import *
from tkinter.simpledialog import *
from wand.image import *

#함수 선언 부분
def displayImage(img, width, height) :
    global window, canvas, paper, photo, photo2, oriX, oriY

    window.geometry(str(width) + "x" + str(height))
    if canvas != None:
        canvas.destroy()

    canvas = Canvas(window, width=width, height=height)
    paper = PhotoImage(width=width, height=height)
    canvas.create_image((width/2, height/2), image=paper, state="normal")

    blob = img.make_blob(format='RGB')
    for i in range(0, width):
        for k in range(0, height):
            r = blob[(i*3*width) + (k*3)+0]
            g = blob[(i*3*width) + (k*3)+1]
            b = blob[(i*3*width) + (k*3)+2]
            paper.put("#%02x%02x%02x" % (r,g,b), (k,i))

    canvas.pack()

def func_open() :
    global window, canvas, paper, photo, photo2, oriX, oriY
    readFp = askopenfilename(parent = window, filetypes = (("모든 그림 파일",
                                                            ".jpg; *.jpeg; *.bmp; *.png; *.tif; *.gif"), ("모든파일","*.*")))
    photo = Image(filename= readFp)
    oriX = photo.width
    oriY = photo.height
    photo2 = photo.clone()
    newX = photo2.width
    newY = photo2.height
    displayImage(photo2, newX, newY)
def func_save() :
    global window,canvas,paper,photo,photo2,oriX,oriY

    if photo2 == None:
        return
    saveFp = asksaveasfile(parent = window, mode = "w", defaultextension = ".jpg",
                           filetypes = (("jpg 파일",".jpg; *.jpeg"),("모든파일","*.*")))
    savePhoto = photo2.conver("jpg")
    savePhoto.save(filename = saveFp.name)

def func_exit() :
    pass
def func_zoomin() :
    global window,canvas,paper,photo,photo2,oriX,oriY
    scale = askinteger("확대","확대할 배율을 입력하세요", minvalue =2,maxvalue =4)
    photo2 = photo.clone()
    photo2.resize(int(oriX  * scale),int(oriY * scale))
    newX = photo2.width
    newY = photo2.height
    displayImage(photo2, newX, newY)
def func_zoomout() :
    global window, canvas, paper, photo, photo2, oriX, oriY
    scale = askinteger("축소", "축소할 배율을 입력하세요", minvalue=2, maxvalue=4)
    photo2 = photo.clone()
    photo2.resize(int(oriX / scale), int(oriY / scale))
    newX = photo2.width
    newY = photo2.height
    displayImage(photo2, newX, newY)
def func_mirror1() :
    global window, canvas, paper, photo, photo2, oriX, oriY
    photo2 = photo.clone()
    photo2.flip()
    newX = photo2.width
    newY = photo2.height
    displayImage(photo2, newX, newY)
def func_mirror2() :
    global window, canvas, paper, photo, photo2, oriX, oriY
    photo2 = photo.clone()
    photo2.flop()
    newX = photo2.width
    newY = photo2.height
    displayImage(photo2, newX, newY)
def func_rotate() :
    global window, canvas, paper, photo, photo2, oriX, oriY
    degree = askinteger("회전", "회전할 각도을 입력하세요", minvalue=0, maxvalue=360)
    photo2 = photo.clone()
    photo2.rotate(degree)
    newX = photo2.width
    newY = photo2.height
    displayImage(photo2, newX, newY)
def func_bright() :
    global window, canvas, paper, photo, photo2, oriX, oriY
    value = askinteger("밝게", "값을 입력하세요(100~200)", minvalue=100, maxvalue=200)
    photo2 = photo.clone()
    photo2.modulate(value,100,100)
    newX = photo2.width
    newY = photo2.height
    displayImage(photo2, newX, newY)
def func_dark() :
    global window, canvas, paper, photo, photo2, oriX, oriY
    value = askinteger("어둡게", "값을 입력하세요(0~100)", minvalue=0, maxvalue=100)
    photo2 = photo.clone()
    photo2.modulate(value, 100, 100)
    newX = photo2.width
    newY = photo2.height
    displayImage(photo2, newX, newY)
def func_clear() :
    global window, canvas, paper, photo, photo2, oriX, oriY
    value = askinteger("선명하게", "값을 입력하세요(100~200)", minvalue=100, maxvalue=200)
    photo2 = photo.clone()
    photo2.modulate( 100,value, 100)
    newX = photo2.width
    newY = photo2.height
    displayImage(photo2, newX, newY)
def func_unclear() :
    global window, canvas, paper, photo, photo2, oriX, oriY
    value = askinteger("탁하게", "값을 입력하세요(0~100)", minvalue=0, maxvalue=100)
    photo2 = photo.clone()
    photo2.modulate(100, value, 100)
    newX = photo2.width
    newY = photo2.height
    displayImage(photo2, newX, newY)
def func_bw() :
    global window, canvas, paper, photo, photo2, oriX, oriY
    photo2 = photo.clone()
    photo2.type = "grayscale"
    newX = photo2.width
    newY = photo2.height
    displayImage(photo2, newX, newY)

#전역변수

window, canvas, paper = None, None,None
photo, phto2 = None, None
oriX, oriY = 0,0

#메인코드

window = Tk()
window.geometry("250x250")
window.title("미니 포토샵")

mainMenu = Menu(window)
window.config(menu = mainMenu)
photo = PhotoImage()
pLabel = Label(window, image = photo)
pLabel.pack(expand =1, anchor = CENTER)

fileMenu = Menu(mainMenu)
mainMenu.add_cascade(label = "파일", menu = fileMenu)
fileMenu.add_command(label = "파일 열기",command = func_open)
fileMenu.add_command(label = "파일 저장",command = func_save)
fileMenu.add_separator()
fileMenu.add_command(label = "프로그램 종료", command = func_exit)

image1Menu = Menu(mainMenu)
mainMenu.add_cascade(label = "이미지 처리(1)", menu = image1Menu)
image1Menu.add_command(label = "확대",command = func_zoomin)
image1Menu.add_command(label = "확대",command = func_zoomout)
image1Menu.add_separator()
image1Menu.add_command(label = "상하 반전",command = func_mirror1)
image1Menu.add_command(label = "좌우 반전",command = func_mirror2)
image1Menu.add_command(label ="회전", command = func_rotate)

image2Menu = Menu(mainMenu)
mainMenu.add_cascade(label = "이미지 처리(2)", menu = image2Menu)
image2Menu.add_command(label = "밝게",command = func_bright)
image2Menu.add_command(label = "어둡게",command = func_dark)
image2Menu.add_separator()
image2Menu.add_command(label = "선명하게",command = func_clear)
image2Menu.add_command(label = "탁하게",command = func_unclear)
image2Menu.add_separator()
image2Menu.add_command(label = "흑백이미지",command = func_bw)

window.mainloop()

미니 포토샵ㅇ은 메뉴 구성을 보면 파일을 열고 저장하는 기능이 있습니다.

GIF 뿐만 아니라 JPG, BMP, PNG 등도 처리할 수 있도록 작성했습니다.

 

먼저 각 메뉴를 클릭할 때 실행할 함수명을 미리 정의합니다.

 

Pass는 함수의 본체를 빈 부분으로 두려고 사용한 예약어입니다.

 

단계별로 하나씩 구현합니다.

 

- 이미지 열기 및 화면 출력

파일 - 파일 열기 메뉴를 선택하면 이미지 파일을 열 수 있는 열기 대화상자가 나타나는데 파일을 클릭하면 이미지를 화면에 출력합니다.

 

# 파이썬에서 제공하는 PhotoImage() 함수가 아니라 Wand 라이브러리에서 제공하는 Image() 함수를 사용합니다.

 

- 밝기

이미지를 발게 하거나 어둡게 할 때는 modulate(밝기값, 100, 100) 함수를 사용합니다.

밝기 값이 100이면 원본 밝기이고 100 이상은 밝게, 100 이하는 어둡게 이미지를 처리합니다.

 

선명도도 발기와 비슷합니다.

 

각 메뉴 별 기능이 담겨있습니다.

 

지금 강아지 이미지는 이미지 처리(2) 메뉴의 흑백이미지를 적용해 둔 상태입니다.

 

각 기능을 눌러주면 네이밍에 맞게 기능이 작동됩니다.

반응형

댓글