使用 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

相关文章

Java中使用Java Mail实现邮件服务功能示例

《Java中使用JavaMail实现邮件服务功能示例》:本文主要介绍Java中使用JavaMail实现邮件服务功能的相关资料,文章还提供了一个发送邮件的示例代码,包括创建参数类、邮件类和执行结... 目录前言一、历史背景二编程、pom依赖三、API说明(一)Session (会话)(二)Message编程客

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(

Python判断for循环最后一次的6种方法

《Python判断for循环最后一次的6种方法》在Python中,通常我们不会直接判断for循环是否正在执行最后一次迭代,因为Python的for循环是基于可迭代对象的,它不知道也不关心迭代的内部状态... 目录1.使用enuhttp://www.chinasem.cnmerate()和len()来判断for

使用Python实现高效的端口扫描器

《使用Python实现高效的端口扫描器》在网络安全领域,端口扫描是一项基本而重要的技能,通过端口扫描,可以发现目标主机上开放的服务和端口,这对于安全评估、渗透测试等有着不可忽视的作用,本文将介绍如何使... 目录1. 端口扫描的基本原理2. 使用python实现端口扫描2.1 安装必要的库2.2 编写端口扫

使用Python实现操作mongodb详解

《使用Python实现操作mongodb详解》这篇文章主要为大家详细介绍了使用Python实现操作mongodb的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、示例二、常用指令三、遇到的问题一、示例from pymongo import MongoClientf

SQL Server使用SELECT INTO实现表备份的代码示例

《SQLServer使用SELECTINTO实现表备份的代码示例》在数据库管理过程中,有时我们需要对表进行备份,以防数据丢失或修改错误,在SQLServer中,可以使用SELECTINT... 在数据库管理过程中,有时我们需要对表进行备份,以防数据丢失或修改错误。在 SQL Server 中,可以使用 SE

使用Python合并 Excel单元格指定行列或单元格范围

《使用Python合并Excel单元格指定行列或单元格范围》合并Excel单元格是Excel数据处理和表格设计中的一项常用操作,本文将介绍如何通过Python合并Excel中的指定行列或单... 目录python Excel库安装Python合并Excel 中的指定行Python合并Excel 中的指定列P

浅析Rust多线程中如何安全的使用变量

《浅析Rust多线程中如何安全的使用变量》这篇文章主要为大家详细介绍了Rust如何在线程的闭包中安全的使用变量,包括共享变量和修改变量,文中的示例代码讲解详细,有需要的小伙伴可以参考下... 目录1. 向线程传递变量2. 多线程共享变量引用3. 多线程中修改变量4. 总结在Rust语言中,一个既引人入胜又可

一文详解Python中数据清洗与处理的常用方法

《一文详解Python中数据清洗与处理的常用方法》在数据处理与分析过程中,缺失值、重复值、异常值等问题是常见的挑战,本文总结了多种数据清洗与处理方法,文中的示例代码简洁易懂,有需要的小伙伴可以参考下... 目录缺失值处理重复值处理异常值处理数据类型转换文本清洗数据分组统计数据分箱数据标准化在数据处理与分析过

C#实现添加/替换/提取或删除Excel中的图片

《C#实现添加/替换/提取或删除Excel中的图片》在Excel中插入与数据相关的图片,能将关键数据或信息以更直观的方式呈现出来,使文档更加美观,下面我们来看看如何在C#中实现添加/替换/提取或删除E... 在Excandroidel中插入与数据相关的图片,能将关键数据或信息以更直观的方式呈现出来,使文档更