Pillow教程04:学习ImageDraw+Font字体+alpha composite方法,给图片添加文字水印

本文主要是介绍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方法,给图片添加文字水印的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

React 记忆缓存的三种方法实现

《React记忆缓存的三种方法实现》本文主要介绍了React记忆缓存的三种方法实现,包含React.memo、useMemo、useCallback,用于避免不必要的组件重渲染和计算,感兴趣的可以... 目录1. React.memo2. useMemo3. useCallback使用场景与注意事项在 Re

Android实现图片浏览功能的示例详解(附带源码)

《Android实现图片浏览功能的示例详解(附带源码)》在许多应用中,都需要展示图片并支持用户进行浏览,本文主要为大家介绍了如何通过Android实现图片浏览功能,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

在Android中使用WebView在线查看PDF文件的方法示例

《在Android中使用WebView在线查看PDF文件的方法示例》在Android应用开发中,有时我们需要在客户端展示PDF文件,以便用户可以阅读或交互,:本文主要介绍在Android中使用We... 目录简介:1. WebView组件介绍2. 在androidManifest.XML中添加Interne

Java中字符编码问题的解决方法详解

《Java中字符编码问题的解决方法详解》在日常Java开发中,字符编码问题是一个非常常见却又特别容易踩坑的地方,这篇文章就带你一步一步看清楚字符编码的来龙去脉,并结合可运行的代码,看看如何在Java项... 目录前言背景:为什么会出现编码问题常见场景分析控制台输出乱码文件读写乱码数据库存取乱码解决方案统一使

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配

PHP轻松处理千万行数据的方法详解

《PHP轻松处理千万行数据的方法详解》说到处理大数据集,PHP通常不是第一个想到的语言,但如果你曾经需要处理数百万行数据而不让服务器崩溃或内存耗尽,你就会知道PHP用对了工具有多强大,下面小编就... 目录问题的本质php 中的数据流处理:为什么必不可少生成器:内存高效的迭代方式流量控制:避免系统过载一次性

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

JavaScript中的高级调试方法全攻略指南

《JavaScript中的高级调试方法全攻略指南》什么是高级JavaScript调试技巧,它比console.log有何优势,如何使用断点调试定位问题,通过本文,我们将深入解答这些问题,带您从理论到实... 目录观点与案例结合观点1观点2观点3观点4观点5高级调试技巧详解实战案例断点调试:定位变量错误性能分

Python中 try / except / else / finally 异常处理方法详解

《Python中try/except/else/finally异常处理方法详解》:本文主要介绍Python中try/except/else/finally异常处理方法的相关资料,涵... 目录1. 基本结构2. 各部分的作用tryexceptelsefinally3. 执行流程总结4. 常见用法(1)多个e

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H