软件测试|使用pillow给图片添加水印

简介

水印是一种在图片上添加文字或图像的技术,用于标识图片的来源、版权信息或其他附加信息。Pillow 是一个强大的 Python 图像处理库,它提供了许多功能,包括给图片添加水印。本文将详细介绍如何使用 Pillow 给图片添加水印。

创建水印

在添加水印之前,首先需要创建水印图像或文本。您可以使用图像编辑软件(如 Photoshop)创建水印图像,或者使用文字编辑器创建水印文本。对于本示例,我们将使用水印文本。

创建一个名为 watermark.png 的水印文本图片,将其保存在与脚本相同的目录中。确保水印图像的背景是透明的,这样它才能正确叠加在图片上。

添加水印到图片

接下来,让我们使用 Pillow 来将水印添加到一张图片上。以下是一个详细的步骤:

from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont# 打开原始图片
image = Image.open("original_image.jpg")# 打开水印图片
watermark = Image.open("watermark.png")# 获取原始图片的宽度和高度
width, height = image.size# 创建一个新的图像对象,用于叠加水印
watermarked_image = image.copy()# 计算水印位置(通常在右下角)
margin = 10
position = (width - watermark.width - margin, height - watermark.height - margin)# 叠加水印
watermarked_image.paste(watermark, position, watermark)# 保存带水印的图片
watermarked_image.save("watermarked_image.jpg")# 显示图片
watermarked_image.show()

上述代码步骤如下:

  1. 使用 Image.open() 打开原始图片和水印图片。
  2. 获取原始图片的宽度和高度。
  3. 创建一个新的图像对象 watermarked_image,该图像是原始图片的副本。
  4. 计算水印的位置,通常在右下角,并留出一些边距。
  5. 使用 paste() 方法将水印图像叠加到原始图片上。
  6. 使用 save() 方法保存带水印的图片。
  7. 使用 show() 方法显示带水印的图片。

自定义水印样式

当然我们也可以自己定义水印的样式,步骤如下:

from PIL import ImageFont, ImageDraw# 打开原始图片
image = Image.open("original_image.jpg")# 创建一个可绘制的对象
draw = ImageDraw.Draw(image)# 定义水印文本
watermark_text = "My Watermark"# 定义字体和大小
font = ImageFont.truetype("arial.ttf", 36)# 定义水印颜色
fill_color = (255, 255, 255, 128)# 计算水印位置(通常在右下角)
margin = 10
width, height = image.size
text_width, text_height = draw.textsize(watermark_text, font)
position = (width - text_width - margin, height - text_height - margin)# 将水印添加到图片上
draw.text(position, watermark_text, font=font, fill=fill_color)# 保存带水印的图片
image.save("watermarked_image.jpg")# 显示图片
image.show()

在上述代码中,我们使用 ImageDraw.Draw() 创建了一个可绘制对象,然后定义了水印文本、字体、大小、颜色和位置,并将水印添加到原始图片上。

总结

本文主要介绍了如何使用pillow给图片添加水印,在添加水印的时候,我们还可以自定义水印的样式,这样我们可以更好地实现对我们图片版权的保护

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/624951.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot中整合ElasticSearch快速入门以及踩坑记录

场景 若依前后端分离版手把手教你本地搭建环境并运行项目: 若依前后端分离版手把手教你本地搭建环境并运行项目_本地运行若依前后端分离-CSDN博客 参考上面搭建项目。 ElaticSearch Elasticsearch 是java开发的,基于 Lucene 的搜索引擎。它提供了一…

Android perfetto memory开源工具分析

目录 原理 官网链接 下载heap_profile producer_support.cc 本地编译 push heapprofd 工具使用 pb文件获取 打开*.pb文件 trace文件 提高系统CPU性能 拆解特定函数内存占用 环境配置 工具使用 修改heap_profile 脚本 原理 Android perfetto memory分析工具和ma…

QT图表-折线图、曲线图

时间记录:2024/1/15 一、使用步骤 1.添加图表模块 .pro项目管理文件中添加charts模块 QChart类:图表类 QChartView类:图表显示类 2.ui文件中添加QChartView组件 (1)选择一个QGrapicsView组件将其拖拽到ui界面上合适位…

TCP怎么保证传输过程的可靠性?

校验和 发送方在发送数据之前计算校验和,接收方收到数据后同样计算,如果不一致,那么传输有误 确认应答,序列号 TCP进行传输时数据都进行了编号,每次接收方返回ACK都有确认序列号。 超时重试 如果发送方发送数据一段时间后没有收到…

pandas查看数据常用方法(以excel为例)

目录 1.查看指定行数的数据head() 2. 查看数据表头columns 3.查看索引index 4.指定索引列index_col 5.按照索引排序 6.按照数据列排序sort_values() 7.查看每列数据类型dtypes 8.查看指定行列数据loc 9.查看数据是否为空isnull() 1.查看指定行数的数据head() &#xff…

二分图带权最大匹配-KM算法详解

文章目录 零、前言一、红娘再牵线二、二分图带权最大完备匹配2.1二分图带权最大匹配2.2概念2.3KM算法2.3.1交错树2.3.2顶标2.3.3相等子图2.3.4算法原理2.3.5算法实现 三、OJ练习3.1奔小康赚大钱3.2Ants 零、前言 关于二分图:二分图及染色法判定-CSDN博客 关于二分…

JVM 一些重要配置参数

1、内存配置参数 -Xmx<size>&#xff1a;设置Java堆的最大内存。如 -Xmx2g 将堆的最大大小设置为2G&#xff0c;推荐配置为系统可用内存的70-80%-Xms<size>&#xff1a;设置Java堆的初始内存。如 -Xms2g 将堆的初始大小设置为2G&#xff0c;推荐配置与-Xmx的值相同…

华为云优惠券介绍、种类、领取入口及使用教程

华为云作为国内领先的云服务提供商&#xff0c;为了吸引用户&#xff0c;经常推出各种优惠活动&#xff0c;其中就包括华为云优惠券。通过领取和使用优惠券&#xff0c;可以降低用户上云成本&#xff0c;提升用户上云的使用体验。本文将详细介绍华为云的优惠券&#xff0c;包括…

Notepad++安装步骤

Notepad是一款文本编辑工具&#xff0c;支持27种编程语言&#xff0c;通吃C,C ,Java ,C#, XML, HTML, PHP,JS 等&#xff0c;该软件拥有完整的中文化接口及支持多国语言编写的功能&#xff0c;不仅可以用来制作一般的纯文字说明文件&#xff0c;还非常适合编写计算机程序代码&a…

2024年,如何打造惊艳的个人博客/出版系统并且赚点小钱?

几年前&#xff0c;我就推荐过用Markdown写作静态博客。静态博客几乎是零托管成本&#xff0c;比较适合个人博客起步。Markdown便于本地搜索&#xff0c;也可当作是个人知识库方案。 现在有了新的进展。我不仅构建了一个视觉上相当不错的个人网站&#xff0c;还美化了github、…

前端环境安装【mac/window,nvm管理多个版本node,node,npm,yarn,react】

目录 nvm 安装 window mac 常见命令 Node、npm yarn React a.全局方式 b.临时方式 运行 nvm nvm 主要是用来管理 nodejs 和 npm 版本的工具&#xff0c;可以用来切换不同版本的 nodejs。安装nvm之前先卸载node Mac彻底卸载node sudo rm -rf /usr/local/{bin/{nod…

abseil中的微操

给分支预测器的建议 原始代码 以下代码用于实现多线程中只调用一次的效果&#xff0c;这里的if大多数情况下都是false&#xff0c;即已经被调用过了。这里是否被调用过用的是一个std::atomic<uint32_t>的原子变量 template <typename Callable, typename... Args>…

Mybatis配置动态数据源以及参数传递等

Mybatis必知必会 一、Mybatis动态加载数据源 在配置数据源连接时,在企业的真实开发中数据源一般都会写在配置文件中&#xff0c;而不会直接写在mybatis的核心配置文件中 所以,Mybatis为了方便开发人员去动态的获取数据源连接制定了一些特定的标签用于加载这些数据源。 具体做法…

TypeScript快速入门 - 类的使用

TypeScript 类 1、类的声明 关键字&#xff1a;class class Child {} 2、类的继承 关键字&#xff1a;extends class Father{ }class Child extends Father {} 3、类与接口 关键字&#xff1a;implments interface IMan {name: string }class Father implements IMan {na…

c语言题目之斐波那契数列

文章目录 题目一、什么叫斐波那契数列1&#xff0c;由来2&#xff0c;定义 二、代码编写总结 题目 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、什么叫斐波那契数列 1&#xff0c;由来 在数学历史上&#xff0c;欧洲黑暗时期过后&#xff0c;第…

关于:必应搜索页面自动返回顶部

最近用bing用得比较多&#xff0c;有一个现象特别影响使用体验&#xff0c;使用 Bing 搜索引擎进行搜索时&#xff0c;查看搜索结果后返回上一页&#xff0c;搜索结果页面会显示到顶部。 也就是说&#xff0c;我如果看完了某一条结果&#xff0c;现在我想返回去搜索页进入另外…

web3d-three.js场景设计器-sprite广告牌

three.js使用Sprite精灵实现文字或者图片广告牌1.将文字绘制到Canvas&#xff0c;调整对应宽高。2.作为Cavans材质绑定到Sprite3.加载到场景调整适当的scale function createLabel({ text, fontSize, textColor, color, imageUrl }) { return new Promise((resolve, reject) &…

数据结构学习 jz66 构建乘积数组

关键词&#xff1a;数学 双指针 方法一&#xff1a;这个题目我一开始做不知道不能用除法。我做的&#xff1a;[ 用时: 12 m 12 s ] 用了除法 分类讨论 方法二&#xff1a;后来看了提示&#xff0c;双指针&#xff0c;两边各开始乘。 方法三&#xff1a;然后又看了答案可以节…

利用Java的加锁文件机制实现只运行一个进程实例

public static void main(String[] args) { if(isStarted()) { JOptionPane.showMessageDialog(null, "软件正在运行中"); System.exit(0); } //start app; } private static FileLock lock null; // 判断该应用是…