________________________________________________________________
from tkinter import *
from PIL import ImageTk, Image, ImageFilter, ImageOps, ImageEnhance
from tkinter import filedialog
from tkinter import ttk
screen = Tk()
screen.geometry(“1000×700”)
screen.title(‘Image Editor’)
screen.iconbitmap(‘editor.ico’)
img = Image.open(“images/img1.jpg”)
img = img.resize((700, 600))
edited_img = img.copy()
def displayimage(image=None):
if image is None:
image = img
dispimage = ImageTk.PhotoImage(image)
panel.configure(image=dispimage)
panel.image = dispimage # type: ignore
def openimg():
global img, edited_img
imgname = filedialog.askopenfilename(title=”Open”, initialdir=’images’)
if imgname:
img = Image.open(imgname)
img = img.resize((600, 600))
edited_img = img.copy()
displayimage()
def rotate():
global img, edited_img
img = img.rotate(45,)
edited_img = img.copy()
displayimage()
def flip():
global img, edited_img
img = img.transpose(Image.FLIP_LEFT_RIGHT)
edited_img = img.copy()
displayimage()
def apply_filter(filter_type):
global edited_img
edited_img = img.copy()
if filter_type == ‘No Filter’:
displayimage(edited_img)
return
edited_img = edited_img.convert(‘RGB’) # Convert to RGB mode for filtering
if filter_type == ‘Black & White’:
edited_img = ImageOps.grayscale(edited_img)
elif filter_type == ‘Blur’:
edited_img = edited_img.filter(ImageFilter.BLUR)
elif filter_type == ‘Sharpen’:
edited_img = edited_img.filter(ImageFilter.SHARPEN)
elif filter_type == ‘Smooth’:
edited_img = edited_img.filter(ImageFilter.SMOOTH)
elif filter_type == ‘Emboss’:
edited_img = edited_img.filter(ImageFilter.EMBOSS)
elif filter_type == ‘Brightness’:
enhancer = ImageEnhance.Brightness(edited_img)
edited_img = enhancer.enhance(1.5) # Increase brightness by 50%
elif filter_type == ‘Contrast’:
enhancer = ImageEnhance.Contrast(edited_img)
edited_img = enhancer.enhance(1.5) # Increase contrast by 50%
elif filter_type == ‘Saturation’:
enhancer = ImageEnhance.Color(edited_img)
edited_img = enhancer.enhance(1.5) # Increase saturation by 50%
displayimage(edited_img)
def apply_effect(effect_type):
global edited_img
edited_img = img.copy()
if effect_type == ‘Grayscale’:
edited_img = ImageOps.grayscale(edited_img)
elif effect_type == ‘Invert’:
edited_img = ImageOps.invert(edited_img.convert(“RGB”))
elif effect_type == ‘Posterize’:
edited_img = ImageOps.posterize(edited_img.convert(“RGB”), 3)
displayimage(edited_img)
global img
imgname = filedialog.asksaveasfilename(title=”Save As”, defaultextension=”.jpg”)
if imgname:
img.save(imgname)
panel = Label(screen, bg=”BLACK”)
panel.grid(row=0, column=0, rowspan=12, padx=50, pady=50)
displayimage()
btnOpen = Button(screen, text=’Open’, width=25, command=openimg, bg=”RED”)
btnOpen.grid(row=0, column=1)
btnRotate = Button(screen, text=’Rotate’, width=25, command=rotate, bg=”BLUE”)
btnRotate.grid(row=1, column=1)
btnFlip = Button(screen, text=’Flip’, width=25, command=flip, bg=”PINK”)
btnFlip.grid(row=2, column=1)
filter_label = Label(screen, text=’Select Filter’, bg=’sea green’)
filter_label.grid(row=3, column=1)
filter_combobox = ttk.Combobox(screen, values=[‘No Filter’, ‘Black & White’, ‘Blur’, ‘Emboss’, ‘Sharpen’, ‘Smooth’,
‘Brightness’, ‘Contrast’, ‘Saturation’])
filter_combobox.grid(row=4, column=1, padx=0, pady=2)
filter_combobox.bind(“<<ComboboxSelected>>”, lambda event: apply_filter(filter_combobox.get()))
effect_label = Label(screen, text=’Select Effect’, bg=’green’)
effect_label.grid(row=5, column=1)
effect_combobox = ttk.Combobox(screen,values=[‘No Effect’, ‘Grayscale’, ‘Invert’, ‘Posterize’])
effect_combobox.grid(row=6, column=1, padx=0, pady=2)
effect_combobox.bind(“<<ComboboxSelected>>”, lambda event: apply_effect(effect_combobox.get()))
btnSave = Button(screen, text=’Save As’, width=25, command=save, bg=”YELLOW”)
btnSave.grid(row=7, column=1)
screen.mainloop()