반응형
저번에 글애 이어 완성을 하겠습니다.
2021.11.10 - [프로그래밍언어/Python] - [Python] : 미니 포토샵 프로젝트 (1부)
미니 포토샵 프로젝트
#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) 메뉴의 흑백이미지를 적용해 둔 상태입니다.
각 기능을 눌러주면 네이밍에 맞게 기능이 작동됩니다.
반응형
'프로그래밍언어 > Python' 카테고리의 다른 글
[Python] : 정적 웹 페이지 크롤링 (0) | 2021.11.17 |
---|---|
[Python] : 웹 크롤링 (0) | 2021.11.17 |
[Python] : 미니 포토샵 프로젝트 (1부) (0) | 2021.11.10 |
[ Python] : 그림판 프로그램 (0) | 2021.11.10 |
[Python] : 동물 투표 프로그램 (0) | 2021.11.10 |
댓글