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 图像处理

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

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

相关文章

盲盒小程序开发,互联网盲盒下的潜在发展优势

近几年,我国潮玩市场经历了爆发式的发展阶段,尤其是盲盒市场屡创新高!盲盒商品主打IP衍生品、周边等具有收藏价值的商品,深受市场的追捧,满足了不同年龄群体的需求。面对盲盒的蓝海市场,众多的品牌也纷纷加…

Altium Designer的差分对布线走线技巧及规则设置

AD的PCB页面是有差分对布线的工具的,这种工具的使用首先需要自己添加差分对,才能进行交互式差分对布线: 在原理图中放置差分对标识,其中差分对要以_P和_N结尾来命名: 在原理图中放置差分对: 差分对在PCB中的…

浏览器导出excel

做java web项目时&#xff0c;经常遇到需要在页面上点击导出按钮&#xff0c;然后直浏览器接下载下来一个excel文档。 比如一个List<Person>的集合&#xff0c;需要将每个Person当做一行&#xff0c;输出到excel中去。其中Person实体类如下&#xff1a; import lombok.…

selenium元素定位--xpath定位--层级与逻辑组合定位

其他元素非唯一时&#xff0c;又不想用xpath绝对定位时&#xff0c;需要用到层级与逻辑定位. 一、层级属性结合定位&#xff1a; 遇到元素没有class、name、id等或属性动态变化情况时&#xff0c;可以找父节点元素&#xff0c;父级节点没有id时&#xff0c;可以继续往上找id&…

✨一键释放手机空间,让生活更流畅——手机清理大师超实用体验分享

&#x1f4dd;亲爱的朋友们&#xff0c;你是否也曾为手机里堆积如山的照片、杂乱无章的相册和不断提醒存储不足的问题而头疼不已呢&#xff1f;今天给大家安利一款我近期爱不释手的神器——手机清理大师&#xff0c;它就如同你的手机专属大扫除小能手&#xff0c;让你的手机瞬间…

Python爬虫:爬虫基本概念、流程及https协议

本文目录&#xff1a; 一、爬虫的基本概念1.为什么要学习爬虫1.1 数据的来源1.2 爬取到的数据用途 2.什么是爬虫3. 爬虫的更多用途 二、爬虫的分类和爬虫的流程1.爬虫的分类2.爬虫的流程3.robots协议 三、爬虫http和https1.http和https的概念2.浏览器发送HTTP请求的过,2.1 http…

数据分析面试题(41~50)

41、lstm的原理、lstm和rnn的区别 ①LSTM是一种常用于处理序列数据的循环神经网络&#xff08;RNN&#xff09;架构&#xff0c;特别适用于长序列的建模。其主要特点是通过门控机制来控制信息的流动&#xff0c;从而有效地解决了传统RNN在处理长序列时的梯度消失或爆炸的问题。…

Git学习笔记之基础

本笔记是阅读《git pro》所写&#xff0c;仅供参考。 《git pro》网址https://git-scm.com/book/en/v2 git官网 https://git-scm.com/ 一、git起步 1.1、检查配置信息 git config --list查看所有的配置以及它们所在的文件 git config --list --show-origin可能有重复的变量名…

云原生最佳实践系列 3:基于 SpringCloud 应用玩转 MSE

概述 随着业务不断创新&#xff0c;大型的单个应用和服务会被拆分为数个甚至数十个微服务&#xff0c;微服务架构已经被广泛应用。微服务的好处在于快速迭代&#xff0c;迭代过程保障线上流量不受损。依赖开源产品缺少专业运维工具&#xff0c;常常需要投入较大的运维人力和成…

SCI一区 | Matlab实现WOA-TCN-BiGRU-Attention鲸鱼算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测

SCI一区 | Matlab实现WOA-TCN-BiGRU-Attention鲸鱼算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测 目录 SCI一区 | Matlab实现WOA-TCN-BiGRU-Attention鲸鱼算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测预测效果基本介绍模型描述程序…

Matter - nordic 自定义开发(4)

nRF Connect SDK 和 Matter SDK 的 matter 协议版本 nRF Connect SDK&#xff08;NCS&#xff09;是 Nordic 官方维护的&#xff0c;里面包含某个版本的 Matter SDK。Matter SDK 为 CSA 联盟维护的&#xff0c;里面包含各平台的SDK&#xff0c;其中包含了某个版本的 NCS。 需…

抖音视频关键词批量采集工具|无水印视频爬虫提取软件

抖音视频关键词批量采集工具&#xff1a; 我们很高兴地介绍最新推出的抖音视频关键词批量采集工具&#xff0c;该工具集成了多项强大功能&#xff0c;让您轻松实现视频内容的批量提取和下载。以下是详细的功能解析和操作说明&#xff1a; 主要功能&#xff1a; 关键词批量提取…

数据库与缓存一致性如何保证

最近建了一个技术交流群&#xff0c;欢迎志同道合的同学加入&#xff0c;群里主要讨论&#xff1a;分享业务解决方案、深度分析面试题并解答工作中遇到的问题&#xff0c;同时也能为我提供写作的素材。 欢迎加Q&#xff1a;312519302&#xff0c;进群讨论 前言 在工作中&#…

锦城软件定义网络实验(只用于教学,第八周结束后自行删除)

一、实验环境简介&#xff1a; Ubuntu 20.0.4 Ryu/Opendaylightmininetsflow(网络监视技术)Apifox/postman(REST API流表控制工具) 二、软件定义网络知识图谱 三、SDN知识概述 1.SDN的三个主要特征&#xff1a; 网络开放可编程&#xff1b; 控制平面与数据平面分离…

云架构(二) 大使模式

Ambassador pattern &#xff08;https://learn.microsoft.com/en-us/azure/architecture/patterns/ambassador&#xff09; 简单描述 创建一个助手服务&#xff0c;这个服务代表消费服务或者应用程序发送网络请求。大使服务可以看做是与客户机同一个位置的进程外代理。 这种…

Web CSS笔记2

目录 1、背景 ①、背景图片(image) ②、背景平铺&#xff08;repeat&#xff09; ③、背景位置(position) ④、背景附着&#xff08;attachment&#xff09; ⑤、背景透明(CSS3) ⑥、背景图片缩放大小&#xff08;size&#xff09;&#xff1a; ⑦、背景简写 2、标签显…

java智慧工地源码 大型建筑公司应用的智慧工地系统源码 智慧工地建筑管理系统源码

java智慧工地源码 大型建筑公司应用的智慧工地系统源码 智慧工地建筑管理系统源码 智慧工地是智慧地球理念在工程领域的具体体现&#xff0c;它代表了一种全新的工程全生命周期管理理念。通过运用信息化手段&#xff0c;智慧工地能够精确设计和模拟工程项目&#xff0c;实现互…

【高危漏洞】关于视频分片上传的漏洞修复

修改文件crmeb/app/services/system/attachment/SystemAttachmentServices.php 增加下方代码&#xff0c;将分片上传的第几片强制转成INT类型解决 $data[chunkNumber] (int)$data[chunkNumber];

linux命令-ln命令详解

文章目录 前言一、ln命令介绍1. 简介2. 硬链接2.1 inode介绍 3. 软连接&#xff08;符号链接&#xff09;4. 语法5. 选项和参数 二、示例用法1. 创建硬链接2. 创建软链接2.1 给文件创建软链接2.2 给目录创建软链接 总结 前言 本文介绍了ln命令的用法和特点&#xff0c;包括硬链…

【TypeScript】解决字面量类型推断错误的四种方式

解决字面量类型推断错误的四种方式 方式一&#xff1a;对象属性使用类型断言方式二&#xff1a;传参使用类型断言方式三&#xff1a;对象使用类型断言方式四&#xff1a;对象属性使用变量&#xff0c;变量使用字面量类型参考 declare function handleRequest(url: string, meth…