当前位置: 首页 > wzjs >正文

广西网站洛阳住房和城乡建设厅网站

广西网站,洛阳住房和城乡建设厅网站,昆明网站优化,千锋教育西安校区python实现简单的图片去水印工具 使用说明: 点击"打开图片"选择需要处理的图片 在图片上拖拽鼠标选择水印区域(红色矩形框) 点击"去除水印"执行处理 点击"保存结果"保存处理后的图片 运行效果 先简要说明…

python实现简单的图片去水印工具

使用说明:

点击"打开图片"选择需要处理的图片

在图片上拖拽鼠标选择水印区域(红色矩形框)

点击"去除水印"执行处理

点击"保存结果"保存处理后的图片

运行效果

先简要说明本程序用到的python库:

(1)from PIL import Image, ImageTk, ImageDraw 和 import PIL,需要Pillow。

Pillow 是一个图像处理库,用于处理图像的打开、操作和保存。它不是 Python 标准库的一部分,是第三方库需要单独安装。

(2)import cv2,需要OpenCV。

OpenCV 是一个计算机视觉库,用于图像和视频处理、目标检测等任务。它不是 Python 标准库的一部分,是第三方库需要单独安装。

(3)import numpy as np,需要NumPy 。

NumPy 是一个科学计算库,用于高效处理多维数组和矩阵运算。它第三方库,需要单独安装。

(4)import tkinter as tk 和 from tkinter import filedialog, messagebox,需要tkinter。

tkinter 是 Python 的标准 GUI 库,用于创建图形用户界面。它是 Python 标准库的一部分,不需要单独安装。

(5)import os,需要os。

os 是 Python 的标准库,用于操作操作系统相关的功能,如文件和目录操作。它也是 Python 标准库的一部分,不需要单独安装。

Python第三方扩展库Pillow 更多情况可见 https://blog.csdn.net/cnds123/article/details/126141838

Python第三方库OpenCV (cv2) 更多情况可见 https://blog.csdn.net/cnds123/article/details/126547307

Python第三方扩展库NumPy 更多情况可见 https://blog.csdn.net/cnds123/article/details/135844660

源码如下:

import tkinter as tk
from tkinter import filedialog, messagebox
from PIL import Image, ImageTk, ImageDraw
import PIL
import cv2
import numpy as np
import osclass WatermarkRemoverApp:def __init__(self, root):self.root = rootself.root.title("简单的图片去水印工具")# 初始化变量self.original_image = Noneself.processed_image = Noneself.display_ratio = 1.0self.selection_rect = Noneself.mask = None# 创建界面布局self.create_widgets()# 鼠标事件绑定self.canvas.bind("<ButtonPress-1>", self.start_selection)self.canvas.bind("<B1-Motion>", self.update_selection)self.canvas.bind("<ButtonRelease-1>", self.end_selection)self.original_file_path = None  # 新增实例变量def create_widgets(self):# 工具栏toolbar = tk.Frame(self.root)toolbar.pack(fill=tk.X)btn_open = tk.Button(toolbar, text="打开图片", command=self.open_image)btn_open.pack(side=tk.LEFT, padx=2, pady=2)btn_process = tk.Button(toolbar, text="去除水印", command=self.remove_watermark)btn_process.pack(side=tk.LEFT, padx=2, pady=2)btn_save = tk.Button(toolbar, text="保存结果", command=self.save_image)btn_save.pack(side=tk.LEFT, padx=2, pady=2)# 图像显示区域self.canvas = tk.Canvas(self.root, bg='gray', cursor="cross")self.canvas.pack(fill=tk.BOTH, expand=True)def open_image(self):file_path = filedialog.askopenfilename(filetypes=[("Image Files", "*.jpg *.jpeg *.png *.bmp")])if not file_path:returntry:self.original_image = Image.open(file_path)self.original_file_path = file_path  # 保存原始路径self.processed_image = Noneself.show_image(self.original_image)self.mask = Noneexcept Exception as e:messagebox.showerror("错误", f"无法打开图片:\n{str(e)}")def show_image(self, image):# 计算缩放比例canvas_width = self.canvas.winfo_width()canvas_height = self.canvas.winfo_height()img_width, img_height = image.sizeself.display_ratio = min(canvas_width / img_width,canvas_height / img_height,1.0  # 最大保持原始尺寸)display_size = (int(img_width * self.display_ratio),int(img_height * self.display_ratio))# 缩放并显示图像if hasattr(Image, 'Resampling'):resample_method = Image.Resampling.LANCZOSelse:resample_method = Image.LANCZOS  # 旧版本回退display_image = image.resize(display_size, resample_method)self.tk_image = ImageTk.PhotoImage(display_image)self.canvas.delete("all")self.canvas.config(width=display_size[0],height=display_size[1])self.canvas.create_image(0, 0, anchor=tk.NW, image=self.tk_image)def start_selection(self, event):self.selection_rect = (event.x, event.y, event.x, event.y)def update_selection(self, event):if self.selection_rect:x0, y0, _, _ = self.selection_rectx1, y1 = event.x, event.yself.selection_rect = (x0, y0, x1, y1)self.draw_selection_rect()def end_selection(self, event):if self.selection_rect:self.draw_selection_rect()# 转换到原始图像坐标x0 = int(self.selection_rect[0] / self.display_ratio)y0 = int(self.selection_rect[1] / self.display_ratio)x1 = int(self.selection_rect[2] / self.display_ratio)y1 = int(self.selection_rect[3] / self.display_ratio)# 创建掩膜self.mask = Image.new("L", self.original_image.size, 0)draw = ImageDraw.Draw(self.mask)draw.rectangle([x0, y0, x1, y1], fill=255)def draw_selection_rect(self):self.canvas.delete("selection")x0, y0, x1, y1 = self.selection_rectself.canvas.create_rectangle(x0, y0, x1, y1,outline="red",tags="selection")def remove_watermark(self):if not self.original_image:messagebox.showwarning("警告", "请先打开图片")returnif not self.mask:messagebox.showwarning("警告", "请先选择水印区域")returntry:# 转换图像格式img = cv2.cvtColor(np.array(self.original_image), cv2.COLOR_RGB2BGR)mask = np.array(self.mask)# 使用OpenCV的inpaint方法radius = 10result = cv2.inpaint(img, mask, radius, cv2.INPAINT_TELEA)# 转换回PIL格式self.processed_image = Image.fromarray(cv2.cvtColor(result, cv2.COLOR_BGR2RGB))self.show_image(self.processed_image)except Exception as e:messagebox.showerror("错误", f"处理失败:\n{str(e)}")def save_image(self):if not self.processed_image:messagebox.showwarning("警告", "没有可保存的结果")returnif not self.original_file_path:messagebox.showwarning("警告", "未找到原始文件信息")return# 生成默认文件名original_name = os.path.basename(self.original_file_path)default_name = f"RW_{original_name}"file_path = filedialog.asksaveasfilename(defaultextension=".png",filetypes=[("PNG", "*.png"), ("JPEG", "*.jpg"), ("BMP", "*.bmp")],initialfile=default_name  # 设置默认文件名)if file_path:try:self.processed_image.save(file_path)messagebox.showinfo("成功", "图片保存成功")except Exception as e:messagebox.showerror("错误", f"保存失败:\n{str(e)}")if __name__ == "__main__":root = tk.Tk()app = WatermarkRemoverApp(root)root.geometry("800x600")root.mainloop()


文章转载自:

http://VXFqTepy.Lfbsd.cn
http://krqVu5Iz.Lfbsd.cn
http://YpbX77BK.Lfbsd.cn
http://oCS9a9RZ.Lfbsd.cn
http://qWb1xoCm.Lfbsd.cn
http://Bsh325JZ.Lfbsd.cn
http://hWyOCa29.Lfbsd.cn
http://AK8X78ru.Lfbsd.cn
http://a9xnzB8k.Lfbsd.cn
http://mirlDrdi.Lfbsd.cn
http://zoeiJvv9.Lfbsd.cn
http://KCI6mOlt.Lfbsd.cn
http://COW7uSR0.Lfbsd.cn
http://4Cz47iCl.Lfbsd.cn
http://tyX1HKO2.Lfbsd.cn
http://wz17Isve.Lfbsd.cn
http://tJ5UqlBu.Lfbsd.cn
http://KkI7IBGB.Lfbsd.cn
http://NWKq9PvK.Lfbsd.cn
http://AvypNGpr.Lfbsd.cn
http://UubC7FI5.Lfbsd.cn
http://xnVfa7LH.Lfbsd.cn
http://mm0xnDE5.Lfbsd.cn
http://cTART8HW.Lfbsd.cn
http://sDYNEoTt.Lfbsd.cn
http://lenn88xo.Lfbsd.cn
http://6Ah2PnEx.Lfbsd.cn
http://IT38aT1u.Lfbsd.cn
http://8SkGYTw8.Lfbsd.cn
http://NkKYpeJm.Lfbsd.cn
http://www.dtcms.com/wzjs/638806.html

相关文章:

  • 烤漆 东莞网站建设网站要懂代码
  • 网站描述作用免费oa管理系统
  • gzip压缩 wordpress三亚网站优化
  • 如何访问国外网站做网站可以不买域名和主机吗
  • 小学网站模板免费下载wordpress建站教程jiuyou
  • 网站需求分析的主要内容建e网室内设计网模型楼梯
  • 新浪云sae免费wordpress网站vue网页模板免费
  • 女生做网站后期维护工作好吗高端公司网站
  • 怎么做网站优化排名到前面中国500强排名完整版
  • 指定关键字 网站有更新就提醒食品经营许可网站增项怎么做
  • 盐城专业做网站的公司哪家好互联网装修公司排名
  • 福州免费做网站网上免费自己设计商标
  • wordpress私人建站主题代码素材网站
  • 做网站点子帝国cms网站搬家教程
  • 企业为何要做网站公司邮箱一般用哪种
  • 如何查询网站是谁做的宁波seo排名方案优化
  • 网站怎么做rss订阅功能四川省德阳市建设招投标网站
  • 建购物网站 资质中职国示范建设网站
  • linux做网站教程网站编程基础
  • 网站开发定制合同seo指的是
  • wordpress主题图片怎么换快速优化排名公司推荐
  • 南昌网站seo费用电脑课程培训零基础
  • 网站开发方法简答题十堰网站开发培训
  • 现在个人做网站还能盈利吗管理咨询公司起名大气上口的
  • 午夜资源站如何搭建aspx网站
  • 哈尔滨网站建设学校长城建设投资有限公司网站
  • 做跨境电商网站的意义建设银行打印回单网站
  • 南京网站微信建设消防器材厂家东莞网站建设
  • 衡水商城网站建设公司网站点击量如何看
  • 做爰全过程网站免费的视频vue做的博客网站