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

相关文章

Python将博客内容html导出为Markdown格式

《Python将博客内容html导出为Markdown格式》Python将博客内容html导出为Markdown格式,通过博客url地址抓取文章,分析并提取出文章标题和内容,将内容构建成html,再转... 目录一、为什么要搞?二、准备如何搞?三、说搞咱就搞!抓取文章提取内容构建html转存markdown

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

vue使用docxtemplater导出word

《vue使用docxtemplater导出word》docxtemplater是一种邮件合并工具,以编程方式使用并处理条件、循环,并且可以扩展以插入任何内容,下面我们来看看如何使用docxtempl... 目录docxtemplatervue使用docxtemplater导出word安装常用语法 封装导出方

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

Python Websockets库的使用指南

《PythonWebsockets库的使用指南》pythonwebsockets库是一个用于创建WebSocket服务器和客户端的Python库,它提供了一种简单的方式来实现实时通信,支持异步和同步... 目录一、WebSocket 简介二、python 的 websockets 库安装三、完整代码示例1.

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J