from os import path
from tkinter import (BOTH, BROWSE, EXTENDED, INSERT, Button, Frame, Label,
Text, Tk, filedialog, mainloop, messagebox)
from PIL import Image, ImageTk
class Remove_watermark():
def __init__(self) -> None:
self.root = Tk()
self.root.title("去水印")
x = (self.root.winfo_screenwidth() - self.root.winfo_reqwidth()) // 4
y = (self.root.winfo_screenheight() - self.root.winfo_reqheight()) // 4
self.root.geometry(f"{x}x{y}")
self.frame = Frame(self.root).grid(row=0, column=0)
self.old_pic_frame = Frame(self.root).grid(row=1, column=0)
self.new_pic_frame = Frame(self.root).grid(row=1, column=1)
self.width = 10
btn_open = Button(self.frame, text="打开图片", width=self.width, height=1, command=self.open_pic,).grid(
row=0, column=0)
label_white = Label(self.frame, text="", height=1, width=self.width).grid(
row=0, column=1)
btn_process = Button(self.frame, text="去图片水印", width=self.width, height=1, command=self.process,).grid(
row=0, column=2)
label_white = Label(self.frame, text="", height=1, width=self.width).grid(
row=0, column=3)
btn_process = Button(self.frame, text="去文档水印", width=self.width,
height=1, command=self.process_all,).grid(row=0, column=4)
def open_pic(self):
global img
self.screenwidth = self.root.winfo_screenwidth()
self.screenheight = self.root.winfo_screenheight()
self.root.geometry(
f"{self.screenwidth}x{self.screenheight}+0+0")
self.filepath = filedialog.askopenfilename(title='选择图片', filetypes=[
('图片', ['*.jpg', '*.png', '*.gif'])])
img_open = Image.open(fp=self.filepath).convert("RGB")
self.img_width, self.img_height = img_open.size
print(self.img_width, self.img_height)
self.rate = self.img_width / self.img_height
if self.img_height > self.screenheight * 0.5:
width = int(0.5 * self.screenwidth)
height = int(width / self.rate)
img = ImageTk.PhotoImage(
image=img_open.resize(size=(width, height)))
else:
img = ImageTk.PhotoImage(img_open)
label_img = Label(self.old_pic_frame, image=img).grid(row=1, column=1)
def process(self):
"""处理水印"""
global new_img
im = Image.open(self.filepath).convert("RGB")
right_bottom = 4
for w in range(0, self.img_width):
for h in range(0, self.img_height):
pos = (w, h)
if sum(im.getpixel(pos)[:3]) > 600:
im.putpixel(pos, (255, 255, 255))
new_pic_path = path.dirname(
self.filepath) + "/去水印_" + path.basename(self.filepath)
im.save(new_pic_path)
img_open = Image.open(fp=new_pic_path)
if self.img_height > self.screenheight * 0.5:
width = int(0.5 * self.screenwidth)
height = int(width / self.rate)
new_img = ImageTk.PhotoImage(
image=img_open.resize(size=(width, height)))
else:
new_img = ImageTk.PhotoImage(img_open)
label_img_new = Label(self.new_pic_frame, image=new_img).grid(
row=1, column=2)
messagebox.showinfo('温馨提示', "已去除水印,文件保存同文件下!")
def process_all(self):
global new_img
im = Image.open(self.filepath).convert("RGB")
width, height = im.size
for w in range(width):
for h in range(height):
pos = (w, h)
r, g, b = im.getpixel(pos)[:3]
avg = (r + g + b) / 3
limit = 0.10
if avg > 100 and abs((r-avg)/avg) < limit and abs((g-avg)/avg) < limit and abs((b-avg)/avg) < limit:
im.putpixel(pos, (255, 255, 255))
new_pic_path = path.dirname(
self.filepath) + "/去水印_" + path.basename(self.filepath)
im.save(new_pic_path)
img_open = Image.open(fp=new_pic_path).convert("RGB")
if self.img_height > self.screenheight * 0.5:
width = int(0.5 * self.screenwidth)
height = int(width / self.rate)
new_img = ImageTk.PhotoImage(
image=img_open.resize(size=(width, height)))
else:
new_img = ImageTk.PhotoImage(img_open)
label_img_new = Label(
self.new_pic_frame, image=new_img).grid(row=1, column=2)
messagebox.showinfo('温馨提示', "已去除水印,文件保存同文件下!")
if __name__ == "__main__":
main = Remove_watermark()
img = None
new_img = None
mainloop()