使用 Python 和 wxPython 在图片上添加水印

2024-01-06 14:04

本文主要是介绍使用 Python 和 wxPython 在图片上添加水印,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

创建一个基于wxPython的简单水印生成器应用程序。该应用程序具有一个窗口,用户可以选择要添加水印的图片文件,并在输入框中输入要显示在图片底部的文字。点击"印章"按钮后,应用程序将在选择的图片上添加水印,并将生成的带有水印的图片保存在当前目录下的"_copy.jpg"文件中。
C:\pythoncode\new\waterprintonphoto.py
在这里插入图片描述

让我们逐行解释代码的不同部分:

import wx
from PIL import Image, ImageDraw, ImageFont

首先,我们导入所需的模块。wx模块是用于创建GUI应用程序的wxPython库,PIL模块是Python Imaging Library,用于处理图像。

import wx
from PIL import Image, ImageDraw, ImageFont
import osclass WatermarkFrame(wx.Frame):def __init__(self):super().__init__(None, title="水印生成器", size=(400, 300))self.panel = wx.Panel(self)# 创建控件self.file_picker = wx.FilePickerCtrl(self.panel, message="选择图片文件",wildcard="Image files (*.jpg;*.png)|*.jpg;*.png")self.text_ctrl = wx.TextCtrl(self.panel, value="Winfredzhang")self.button = wx.Button(self.panel, label="印章")# 设置布局sizer = wx.BoxSizer(wx.VERTICAL)sizer.Add(self.file_picker, proportion=0, flag=wx.EXPAND | wx.ALL, border=10)sizer.Add(self.text_ctrl, proportion=0, flag=wx.EXPAND | wx.ALL, border=10)sizer.Add(self.button, proportion=0, flag=wx.ALIGN_CENTER | wx.ALL, border=10)self.panel.SetSizer(sizer)# 绑定事件处理函数self.button.Bind(wx.EVT_BUTTON, self.on_generate_watermark)def on_generate_watermark(self, event):filepath = self.file_picker.GetPath()text = self.text_ctrl.GetValue()if filepath and text:image = Image.open(filepath)# 创建一个绘图对象draw = ImageDraw.Draw(image)# 加载字体,指定字体大小font = ImageFont.truetype("C://Windows//Fonts//arial.ttf", 40)# 指定文字的位置,底部居中text_width, text_height = draw.textsize(text, font=font)image_width, image_height = image.sizetext_x = (image_width - text_width) // 2text_y = image_height - text_height - 20  # 20为底部边距# 指定文字的颜色,RGB格式color = (255, 0, 0)# 在图片上绘制文字draw.text((text_x, text_y), text, font=font, fill=color)# 保存图片output_path = "watermarked_image.jpg"image.save(output_path)# 另存为带有水印的图片save_dir, save_filename = os.path.split(filepath)save_name, save_ext = os.path.splitext(save_filename)save_path = os.path.join(save_dir, save_name + "_copy" + save_ext)# watermarked_image.save(save_path)# output_path = "watermarked_image.jpg"image.save(save_path)# 显示成功提示wx.MessageBox("水印已添加并另存为watermarked_image.jpg。", "成功", wx.OK | wx.ICON_INFORMATION)event.Skip()if __name__ == '__main__':app = wx.App()frame = WatermarkFrame()frame.Show()app.MainLoop()

在这部分代码中,我们定义了一个名为WatermarkFrame的类,该类继承自wx.Frame,用于创建水印生成器的主窗口。__init__方法是该类的构造函数,用于初始化窗口和控件。

在构造函数中,我们首先调用super()来调用父类的构造函数。然后,我们创建一个wx.Panel作为窗口的子面板,并将其设置为窗口的主面板。

接下来,我们创建了三个控件:wx.FilePickerCtrl用于选择图片文件,wx.TextCtrl用于输入要显示在水印中的文字,以及一个"印章"按钮。

随后,我们使用sizer来设置控件的布局,将控件添加到sizer中,并将sizer应用于主面板。

最后,我们将"印章"按钮绑定到on_generate_watermark事件处理函数,以便在点击按钮时执行水印生成的操作。

def on_generate_watermark(self, event):filepath = self.file_picker.GetPath()text = self.text_ctrl.GetValue()if filepath and text:image = Image.open(filepath)# 创建一个绘图对象draw = ImageDraw.Draw(image)# 加载字体,指定字体大小font = ImageFont.truetype("C://Windows//Fonts//arial.ttf", 40)# 指定文字的位置,底部居中text_width, text_height = draw.textsize(text, font=font)image_width, image_height = image.sizetext_x = (image_width - text_width) // 2text_y = image_height - text_height - 20  # 20为底部边距# 指定文字的颜色,RGB格式color = (255, 0, 0)# 在图片上绘制文字draw.text((text_x, text_y), text, font=font, fill=color)# 保存图片output_path = "watermarked_image.jpg"image.save(output_path)# 显示成功提示wx.MessageBox("水印已添加并另存为watermarked_image.jpg。", "成功", wx.OK | wx.ICON_INFORMATION)event.Skip()

这是on_generate_watermark事件处理函数。当"印章"按钮被点击时,该函数将被调用。

首先,我们从文件选择控件(file_picker)获取选择的图片文件路径(filepath),并从文本输入控件(text_ctrl)获取输入的文字(text)。

接下来,我们使用Image.open(filepath)打开选择的图片,并创建一个ImageDraw对象(draw)来绘制水印。

然后,我们加载所需的字体文件(arial.ttf)并指定字体大小为40。

接着,我们计算要绘制的文字的位置,将其放置在图片的底部中心位置。我们使用draw.textsize(text, font=font)来获取绘制文字所需的宽度和高度,然后使用图片的宽度和高度计算出文字的x和y坐标。

在绘制文字之前,我们指定文字的颜色为红色(RGB格式)。

最后,我们使用draw.text(...)在图片上绘制文字,将水印添加到图片中。

完成绘制水印后,我们将保存带有水印的图片为"watermarked_image.jpg"文件。

最后,我们显示一个成功的提示消息框,告知用户水印已添加并保存成功。

if __name__ == '__main__':app = wx.App()frame = WatermarkFrame()frame.Show()app.MainLoop()

这是应用程序的入口点。我们创建一个wx.App实例,并实例化WatermarkFrame类作为主窗口。

然后,我们显示主窗口,并启动应用程序的主事件循环(app.MainLoop()),以便处理GUI事件和保持应用程序运行。
在这里插入图片描述

以上是该水印生成器应用程序的详细介绍。当您运行该代码时,将显示一个窗口,您可以选择要添加水印的图片文件,并在输入框中输入要显示在水印中的文字。点击"印章"按钮后,应用程序将在选择的图片上添加水印,并将生成的带有水印的图片保存在当前目录下的"_copy.jpg"文件中。

这篇关于使用 Python 和 wxPython 在图片上添加水印的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/576579

相关文章

Spring中@Lazy注解的使用技巧与实例解析

《Spring中@Lazy注解的使用技巧与实例解析》@Lazy注解在Spring框架中用于延迟Bean的初始化,优化应用启动性能,它不仅适用于@Bean和@Component,还可以用于注入点,通过将... 目录一、@Lazy注解的作用(一)延迟Bean的初始化(二)与@Autowired结合使用二、实例解

SpringBoot使用Jasypt对YML文件配置内容加密的方法(数据库密码加密)

《SpringBoot使用Jasypt对YML文件配置内容加密的方法(数据库密码加密)》本文介绍了如何在SpringBoot项目中使用Jasypt对application.yml文件中的敏感信息(如数... 目录SpringBoot使用Jasypt对YML文件配置内容进行加密(例:数据库密码加密)前言一、J

Spring Boot 中正确地在异步线程中使用 HttpServletRequest的方法

《SpringBoot中正确地在异步线程中使用HttpServletRequest的方法》文章讨论了在SpringBoot中如何在异步线程中正确使用HttpServletRequest的问题,... 目录前言一、问题的来源:为什么异步线程中无法访问 HttpServletRequest?1. 请求上下文与线

在 Spring Boot 中使用异步线程时的 HttpServletRequest 复用问题记录

《在SpringBoot中使用异步线程时的HttpServletRequest复用问题记录》文章讨论了在SpringBoot中使用异步线程时,由于HttpServletRequest复用导致... 目录一、问题描述:异步线程操作导致请求复用时 Cookie 解析失败1. 场景背景2. 问题根源二、问题详细分

从零教你安装pytorch并在pycharm中使用

《从零教你安装pytorch并在pycharm中使用》本文详细介绍了如何使用Anaconda包管理工具创建虚拟环境,并安装CUDA加速平台和PyTorch库,同时在PyCharm中配置和使用PyTor... 目录背景介绍安装Anaconda安装CUDA安装pytorch报错解决——fbgemm.dll连接p

Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)

《Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)》文章介绍了如何使用dhtmlx-gantt组件来实现公司的甘特图需求,并提供了一个简单的Vue组件示例,文章还分享了一... 目录一、首先 npm 安装插件二、创建一个vue组件三、业务页面内 引用自定义组件:四、dhtmlx

使用Python创建一个能够筛选文件的PDF合并工具

《使用Python创建一个能够筛选文件的PDF合并工具》这篇文章主要为大家详细介绍了如何使用Python创建一个能够筛选文件的PDF合并工具,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录背景主要功能全部代码代码解析1. 初始化 wx.Frame 窗口2. 创建工具栏3. 创建布局和界面控件4

一文详解如何在Python中使用Requests库

《一文详解如何在Python中使用Requests库》:本文主要介绍如何在Python中使用Requests库的相关资料,Requests库是Python中常用的第三方库,用于简化HTTP请求的发... 目录前言1. 安装Requests库2. 发起GET请求3. 发送带有查询参数的GET请求4. 发起PO

Python与DeepSeek的深度融合实战

《Python与DeepSeek的深度融合实战》Python作为最受欢迎的编程语言之一,以其简洁易读的语法、丰富的库和广泛的应用场景,成为了无数开发者的首选,而DeepSeek,作为人工智能领域的新星... 目录一、python与DeepSeek的结合优势二、模型训练1. 数据准备2. 模型架构与参数设置3

Python进行PDF文件拆分的示例详解

《Python进行PDF文件拆分的示例详解》在日常生活中,我们常常会遇到大型的PDF文件,难以发送,将PDF拆分成多个小文件是一个实用的解决方案,下面我们就来看看如何使用Python实现PDF文件拆分... 目录使用工具将PDF按页数拆分将PDF的每一页拆分为单独的文件将PDF按指定页数拆分根据页码范围拆分