Pillow教程04:学习ImageDraw+Font字体+alpha composite方法,给图片添加文字水印
---------------Pillow教程集合---------------
Python项目18:使用Pillow模块,随机生成4位数的图片验证码
Python教程93:初识Pillow模块(创建Image对象+查看属性+图片的保存与缩放)
Pillow教程02:图片的裁剪+复制粘贴+旋转角度+翻转+降噪滤镜(平滑、锐化、边缘检测)
Pillow教程03:图像处理的基本步骤+分离split+合并merge+混合blend+composite遮罩
1.ImageDraw:在图像上绘制各种图形(如直线、矩形、椭圆、多边形等)和文本的功能。使用ImageDraw,你可以轻松地在图像上添加标注、绘制形状或进行其他自定义的绘图操作。
# @Author : 小红牛
# 微信公众号:WdPython
from PIL import Image, ImageDraw# 1.创建一个新的空白图像
image = Image.new('RGB', (200, 200), 'white')# 2.创建一个可以在给定图像上,绘图的Draw对象
draw = ImageDraw.Draw(image)# 绘制一条直线,参数为起点和终点的坐标
draw.line((0, 0, 200, 200), fill='red', width=2)# 绘制一个矩形,参数为左上角和右下角的坐标
draw.rectangle([(50, 50), (150, 150)], fill='blue', outline='yellow')# 绘制一个椭圆,参数为左上角的坐标、宽和高
draw.ellipse([(50, 50), (150, 150)], fill='green', outline='black')# 绘制一个多边形,参数为各个顶点的坐标列表
polygon_points = [(50, 50), (100, 50), (100, 100), (50, 100)]
draw.polygon(polygon_points, fill='purple', outline='white')# 绘制文本,参数为文本的左上角坐标、文本内容和颜色
text = 'Hello, Pillow!'
draw.text((60, 30), text, fill='black')# 3.保存图像
image.save('draw.png')
2.ImageFont.truetype():是Pillow库中ImageFont模块的一个方法,用于加载TrueType字体文件,并创建一个字体对象。此方法允许用户从指定的字体文件中加载字体,并为其设置特定的大小,以便在图像绘制中使用。ImageFont.truetype()方法的常见参数包括:
font:TrueType或OpenType字体文件的路径。如果在给定的文件名中找不到字体文件,加载程序可能还会在特定的目录中查找,如Windows系统下的fonts/目录。
size:请求的字体大小(以磅为单位)。
index:要加载的字体索引(默认为第一个可用的字体)。
encoding:使用的字体编码(默认为Unicode)。
from PIL import ImageFont
# 加载字体
font = ImageFont.truetype("arial.ttf", size=15)
font2 = ImageFont.truetype('simkai.ttf', size=50)
计算机本地,中文字体文件有哪些?
微软雅黑(msyh.ttc):这是一种常见的无衬线字体,设计用于屏幕阅读,具有清晰易读的特性。
黑体(simhei.ttc):这是一种传统的中文字体,常用于正式文档和印刷品。
宋体(simsun.ttc):宋体是一种具有传统特色的中文字体,常用于书籍、报纸和杂志等出版物。
楷体(simkai.ttf):楷体模仿了手写汉字的风格,具有古朴典雅的特点。
......等等.........
3.在原图的右下角,添加白色的文字水印
# @Author : 小红牛
# 微信公众号:WdPython
from PIL import Image, ImageDraw, ImageFont# 1.加载原图
image = Image.open('example.png')# 2.创建Draw对象
draw = ImageDraw.Draw(image)# 3.设置水印文字内容
watermark_text = '@刘亦菲+白鹿'
# 设置水印的位置(右下角显示)
text_position = (image.width-400, image.height-150)
# 设置水印的颜色(白色)
text_color = (255, 255, 255)# 4.设置水印文字的字体和大小
# 如果不指定字体,可以使用默认字体,但通常需要指定字体大小和路径
font = ImageFont.truetype('simkai.ttf', size=50)# 绘制水印文字
# 如果指定了字体,传入font参数,否则直接传入文字内容和位置
draw.text(text_position, watermark_text, fill=text_color, font=font)# 5.保存带有水印的图像
image.save('watermark.png')
4.添加图片水印:图片水印相比文字水印的操作,要更人性化一点,水印文字长短不同,需要重新计算水印的位置。使用图片水印,就可以自动计算水印的位置。
代码思路解析:准备一张原图和新建一个水印图,并把图片格式设为RGBA模式 。pillow版本为10.以上,请使用textbbox来获取文本的大小,低版本的可使用draw.textsize来获取水印文字的大小,然后基于这个大小设置水印文字的位置。接着,我们在水印图像上绘制了带有透明度的文本,最后将原始图像和带有水印文字的图像通过Image.alpha_composite进行alpha合成,生成带有水印的最终图像。
# 使用draw.textsize方法,获取文字的大小
draw = ImageDraw.Draw(watermark_image)
#设置文本文字大小
text_width,text_height = draw.textsize(text,font=font)
print(text_width,text_height)
Image.alpha_composite() 方法会考虑这个alpha通道,并相应地合成水印到原始图像上。最后,我们使用convert 方法将结果图像转换回原始图像的模式(如果原始图像不是RGBA模式的话)
# -*- coding: utf-8 -*-
# @Author : 小红牛
# 微信公众号:WdPython
from PIL import Image, ImageFont, ImageDrawfont = ImageFont.truetype('simkai.ttf', size=50)def add_watermark(original_images, water_text, font=font):# 1.给水印添加透明度,因此需要转换图片的格式original_image = original_images.convert('RGBA')# 按照原图的尺寸,新建一个RGBA模式的白色图片watermark_image = Image.new('RGBA', original_image.size, (255, 255, 255, 0))print('1.get原图的宽高:', original_image.size)# 2.pillow版本为10以上,请使用textbbox来获取文本的大小draw = ImageDraw.Draw(watermark_image)bbox = draw.textbbox((0, 0), water_text, font=font)text_width = bbox[2] - bbox[0]text_height = bbox[3] - bbox[1]print('2.水印文字的大小:', text_width, text_height)# 3.计算水印,显示的位置,这里假设放在右下角# 获取原始图像的宽高original_width, original_height = original_image.sizeposition = (original_width - text_width-50, original_height - text_height-50)print('3.计算水印显示的位置:', position)# 4.在position位置,绘制文本水印,设置水印颜色(白色)和透明度(半透明)draw.text(position, water_text, font=font, fill=(255, 255, 255, 128))# 5.将原图片与带有水印文字的图像进行alpha合成water_image = Image.alpha_composite(original_image, watermark_image)return water_image# 原始图像
image = Image.open('new_image2.png')
# 添加水印文字
image_water = add_watermark(image, '图片水印@刘亦菲+白鹿')
# 保存水印图
image_water.save('watermark2.png')
完毕!!感谢您的收看
----------★★历史博文集合★★----------
我的零基础Python教程,Python入门篇 进阶篇 视频教程 Py安装py项目 Python模块 Python爬虫 Json Xpath 正则表达式 Selenium Etree CssGui程序开发 Tkinter Pyqt5 列表元组字典数据可视化 matplotlib 词云图 Pyecharts 海龟画图 Pandas Bug处理 电脑小知识office自动化办公 编程工具 NumPy Pygame 图像处理
相关文章:

Pillow教程04:学习ImageDraw+Font字体+alpha composite方法,给图片添加文字水印
---------------Pillow教程集合--------------- Python项目18:使用Pillow模块,随机生成4位数的图片验证码 Python教程93:初识Pillow模块(创建Image对象查看属性图片的保存与缩放) Pillow教程02:图片的裁…...
fastjson2 反序列化包含多层泛型结构的实体类
前言 由于使用到httpUtill来调用接口 工具类的返回是字符串 其中接口的实现返回值是个多层泛型结构的实体类 例如Result<Page<UserDto>> 当使用 JSON.parseObject("res",new TypeReference<Result<Page<UserDto>>>{})发现在page中存在…...

P6学习:解析P6 WBS-工作分解结构的原则
前言 WBS,及Work Breakdown Structure,中文工作分解结构,是总结工作阶段的项目的层次结构分解。 WBS 就像项目的大纲——它将项目分解为特定的可交付成果或阶段。 然后将活动添加到这些层中以创建项目计划的时间表。 WBS 使用流程会有所不…...
C++ empalce_back 和 push_back的区别
在C中,push_back和emplace_back都是向容器(如std::vector、std::list等)尾部添加元素的成员函数。它们的主要区别在于元素的构造方式和参数传递方式。 push_back函数接受一个已经构造好的元素,并将其复制或移动到容器的尾部。这意…...
java1.8常考面试题
在Java 1.8版本中,引入了很多重要的新特性,这些特性常常成为面试的焦点。下面是一些在面试中常见的关于Java 1.8的问题及其解答,帮助你准备面试: 1. Java 1.8的主要新特性有哪些? Lambda表达式(Lambda Ex…...
Java 中的业务是指什么?
在 Java 编程中,业务(Business)是指软件系统中负责实现特定功能或处理特定任务的一组逻辑和功能。业务通常是指与业务需求直接相关的功能和处理过程,包括数据处理、业务逻辑、交易处理、业务规则等。在软件开发中,业务…...

【MySQL】聊聊自增id用完怎么办?
在实际的开发中,一般都会将数据存储到数据库中,在设计表的时候,其实id如果达到最大值的话,会出现什么问题。其实主要分两种情况,一种是设置了主键id,另一种没有设置主键id。 表定义自增值id create table…...

新能源汽车充电桩主板各模块成本占比解析
汽车充电桩主板是汽车充电桩的重要组件,主要由微处理器模块、通信模块、控制模块、安全保护模块、传感器模块等多个模块构成。深入探究各模块在总成本中的比重,我们可以更好地优化成本结构、提高生产效率,并为未来的技术创新和市场需求变化做…...

【面试经典150 | 动态规划】三角形最小路径和
文章目录 写在前面Tag题目来源解题思路方法一:动态规划 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更…… 专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等内容进行…...

【线段树二分】第十三届蓝桥杯省赛C++ A组/研究生组 Python 研究生组《扫描游戏》(C++)
【题目描述】 有一根围绕原点 O 顺时针旋转的棒 OA,初始时指向正上方(Y 轴正向)。 在平面中有若干物件,第 i 个物件的坐标为(,),价值为 。 当棒扫到某个物件时,棒的长度会瞬间增长 ÿ…...
类模板与继承及成员、全局函数的实现
一、类模板与继承 当类模板碰到继承时,需要注意一下几点: 1.当子类继承的父类是一个类模板时,子类在声明的时候,要指定出父类中T的类型 2.如果不指定,编译器无法给子类分配内存 3.如果想灵活指定出父类中T的类型&a…...

怎么制作iOS证书
首先我们登录appuploder官网 搜索 appuploder 第一个就是我们官网啦,网址是:Appuploader home -- A tool improve ios develop efficiency such as submit ipa to appstore and manage ios certificate 可以跨平台开发,无论是Windows还是Ma…...

图床项目实战:从零搭建一个简易图床
项目背景与需求分析 随着互联网的发展,图片分享、存储和管理的需求日益增长。图床作为一种专门用于存储和分享图片的服务,受到了广大用户的欢迎。本项目旨在搭建一个简易的图床系统,满足用户上传、查看和删除图片的基本需求。 技术选型 本项…...

双亲委派机制总结
回顾了一下双亲委派机制,在这记录记录,下一篇会基于打破双亲委派机制来更新 1. 类加载: 多个java文件经过编译打包后生成可运行jar包,最后启动程序。首先需要通过类加载器把主类加载到JVM。主类在运行过程中如果使用到其他类&a…...

C语言数据结构基础————二叉树学习笔记(四)简单的OJ题目练习
1.单值二叉树 965. 单值二叉树 - 力扣(LeetCode) 建立一个新的函数,用函数传参的方法来记录val的值 如上一篇最后的对称二叉树的习题,建立新的函数来传参 多采用使用反对值的方法,因为如果是相等return true的话&am…...
protobuf学习笔记(一):生成一个比较综合的message
一年前学过对应的知识,终究是太潦草了,这几天网上学习了一下,重新写一下笔记。这里是protobuf和golang的结合 一、protobuf protobuf实际上是一种类似json和gob之类的数据格式,也是grpc的御用格式吧(有自己的优势&am…...

[BT]BUUCTF刷题第8天(3.26)
第8天 Web [CISCN2019 华北赛区 Day2 Web1]Hack World 题目明确提示flag在flag表里的flag列,这里先尝试1 返回:你好,glzjin想要一个女朋友。 再尝试1,返回bool(false) 到这里就感觉是布尔盲注的题目类型了(虽然我没…...
【前端】-
相对路径和绝对路径是描述文件位置的两种方式。 1. 相对路径:相对于自己的目标文件的位置,以引用文件之间网页所在位置为参考基础,而建立出的目录路径。因此,当保存于不同目录的网页引用同一个文件时,所使用的路径将不…...

uniapp安装axios
先npm安装 npm i axios然后在项目里面建一个utils文件,再建一个index.js 以下是index.js代码: import axios from axios; const service axios.create({baseURL: //xxxx.xxxxx.com///你的请求接口域名, timeout: 6000, // request timeoutcrossDomai…...

基于javaweb宠物领养平台管理系统设计和实现
基于javaweb宠物领养平台管理系统设计和实现 博主介绍:多年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文末获取源码联…...

大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...

push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
Python网页自动化Selenium中文文档
1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API,让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API,你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...

ZYNQ学习记录FPGA(一)ZYNQ简介
一、知识准备 1.一些术语,缩写和概念: 1)ZYNQ全称:ZYNQ7000 All Pgrammable SoC 2)SoC:system on chips(片上系统),对比集成电路的SoB(system on board) 3)ARM:处理器…...
DAY 26 函数专题1
函数定义与参数知识点回顾:1. 函数的定义2. 变量作用域:局部变量和全局变量3. 函数的参数类型:位置参数、默认参数、不定参数4. 传递参数的手段:关键词参数5 题目1:计算圆的面积 任务: 编写一…...
CppCon 2015 学习:Time Programming Fundamentals
Civil Time 公历时间 特点: 共 6 个字段: Year(年)Month(月)Day(日)Hour(小时)Minute(分钟)Second(秒) 表示…...

【java面试】微服务篇
【java面试】微服务篇 一、总体框架二、Springcloud(一)Springcloud五大组件(二)服务注册和发现1、Eureka2、Nacos (三)负载均衡1、Ribbon负载均衡流程2、Ribbon负载均衡策略3、自定义负载均衡策略4、总结 …...