欢迎光临我要源码 ,本站所有资源仅供学习与参考,禁止用于商业用途或从事违法行为!

python教程

Python一键去除图片水印代码

python教程 51源码 2022-11-03 人阅读
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
[url=home.php?mod=space&uid=267492]@file[/url]    :   RWM.py
[url=home.php?mod=space&uid=238618]@Time[/url]    :   2021/11/25 19:25:55
[url=home.php?mod=space&uid=686208]@AuThor[/url]  :   Ljujl 
[url=home.php?mod=space&uid=1248337]@version[/url] :   1.0
@Contact :   [url=mailto:[email protected]][email protected][/url]
'''
 
# here put the import lib
 
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)  # , columnspan=3,sticky="EW",
        messagebox.showinfo('温馨提示', "完成去除水印啦(:")
 
 
if __name__ == "__main__":
    main = Remove_watermark()
    img = None
    new_img = None
    mainloop()


标签 图片去水印