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
(
self
.img_width
/
/
4
,
self
.img_width):
for
h
in
range
(
self
.img_height
/
/
4
,
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()