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

news2024/11/18 17:43:46

---------------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, ImageDraw

font = 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.size
    position = (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.coloradmin.cn/o/1548063.html

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

相关文章

大数据分析案例-基于决策树算法构建大学毕业生薪资预测模型

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

Web开发基本流程

Web是全球广域网,能够通过浏览器访问的网站。我们要访问网站,首先要在浏览器输入对应的域名。 浏览器也是一个程序,京东的网站也是一个程序,在京东那边电脑运行着,我们只是通过浏览器远程访问。京东的程序由三个部分组…

Redis入门到实战-第十六弹

Redis实战热身Cuckoo filter篇 完整命令参考官网 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://redis.io/Redis概述 Redis是一个开源的(采用BSD许可证),用作数据库、缓存、消息…

Java毕业设计-基于springboot开发的学生就业管理系统-毕业论文+答辩PPT(附源代码+演示视频)

文章目录 前言一、毕设成果演示(源代码在文末)二、毕设摘要展示1、开发说明2、需求分析3、系统功能结构 三、系统实现展示1、前台功能模块2、后台功能模块2.1 管理员功能2.2 学生功能2.3 企业功能 四、毕设内容和源代码获取总结 Java毕业设计-基于spring…

CDLF20-80_立式不锈钢多级泵

一、产品概述CDLF20-80 立式不锈钢多级泵是一款高效能、节能型的多级离心泵,它采用了先进的设计和制造技术,以确保泵的高效率和长期稳定运行。该泵主要用于城市供水、锅炉给水、高层建筑供水及消防系统等场合,能够处理清洁的或稍有污染的冷热…

智能医疗-方案优势

实时更新,信息展示更便利 电子标签床头信息卡可设计特定的信息模板展示病患信息,并可根据治疗进展实时更新,病患通过床头电子标签即可了解病情信息。 —签多能,医护管理更高效 电子墨水屏技术改进了传统院内展示内容单一、更换成…

Autosar Crypto Interface学习笔记

文章目录 前言Functional specificationError classificationError detection API specificationType DefinitionsFunction definitionsGeneral APICryIf_InitCryIf_GetVersionInfo Job Processing InterfaceCryIf_ProcessJobDispatch Key IDs匹配KeyId Job Cancellation Inter…

vmware,linux,centos7,NAT模式下的网络配置

centos7的NAT网络配置 NAT模式说明虚拟机网络配置工具本机配置net8网络(NAT的网域)本机的IP配置(用于net8局域网内解析主机IP和域名对应关系使用)(可选)虚拟机内的网络配置虚拟机ping不通www.baidu.com的情况下虚拟机ping可以ping…

【双指针】Leetcode 三数之和

题目解析 15. 三数之和 这道题有两个需要注意的地方:1. 三个数字也不可以是同一个位置上的 2. 最终结果里面的三元组不可以是重复的 所以这道题就需要对结果实现去重这一个逻辑,遇到相同的数字就需要往后面移动,忽略 算法讲解 1. 首先对数…

2024蓝桥杯每日一题(状压DP)

备战2024年蓝桥杯 -- 每日一题 Python大学A组 试题一:毕业旅行问题 试题二:蒙德里安的梦想 试题三:最短Hamilton路径 试题四:国际象棋 试题一:毕业旅行问题 【题目描述】 小明目前在做一份毕…

集合系列(十六) -集合知识回顾整理

一、摘要 在 Java 中,集合大致可以分为两大体系,一个是 Collection,另一个是 Map,都位于java.util包下。 Collection :主要由 List、Set、Queue 接口组成,List 代表有序、重复的集合;其中 Set…

一文读懂Cache一致性原理

1. 为何需要cache一致性 访问memory数据的速度相比core的运行速度来说,要花费更多的时钟周期,为了减轻这个差异引进了存储器层次结构,如图1所示。在层次结构中,越往上,读写速度越快,价格更贵,存…

Prometheus(六):Blackbox监控安装配置

目录 1 Blackbox Exporter安装配置1.1 Blackbox Exporter简介1.2 安装1、安装-使用源码包安装下载安装blackbox.yml文件配置快速启动文件 2、安装-使用docker 1.3 Prometheus配置1、http监控2、ping探测-ip3、https probe-DNS解析4、metrics配置5、TCP监控-探测端口 总结 1 Bla…

Element UI中日期选择日(date-picker)等其他选择器下拉显示错位、位置错误解决

省流版 给选择器加上唯一key(下面的想看就看) 问题复现 需求是用一个下拉切换时间维度的选择,分别为年度、季度、月度,但是开发的时候发现,当切换的时候,视图可正常切换,但点击选择时却发现选…

InfoNCE loss

InfoNCE loss是一种用于自监督学习的损失函数,通常用于训练对比学习模型,如自编码器或神经网络。全称是"InfoNCE: Contrastive Estimation of Neural Entropy",基于对比学习的思想,旨在最大化正样本的相似性&#xff0c…

关于 C/C++ 1Z(17)开源项目 openppp2 协同程式切换工作流

下述为开源项目 openppp2(github)构建工作在 C/C 17 的 stackful 有栈协同程式的工作流切换示意图: 在 openppp2 之中采用人工手动方式管理协同程式之间的切换,每个中断过程只是保存线程栈信息(如寄存器、当前#PC EIP&…

利用idea创建一个maven web工程

1.创建Maven项目 2.选择不使用Web项目骨架&#xff08;即普通maven项目&#xff09; 3.创建成功后在pom.xml设置打包方式为war&#xff0c;并重构maven项目 <packaging>war</packaging> 4.补齐Maven Web项目缺失webapp的目录结构 右键项目名打开模块设置&#xf…

【STM32+HAL】I2C+DMA读取AS5600编码器

一、DMA的应用 有关更多DMA的应用&#xff0c;详见【STM32HAL】DMA应用 二、HAL库配置 1、开启I2C 开启对应DMA及中断 2、开启串口通信 至此&#xff0c;HAL库配置完毕 三、DMA版&#xff08;高效但不稳定&#xff09; 1、as5600.c #include "AS5600.h" #includ…

Javascript本地存储的方式,区别及应用场景

文章目录 一、方式cookielocalStorage特点sessionStorage扩展的前端存储方式优点&#xff1a;缺点&#xff1a; 二、区别三、应用场景相关连接 一、方式 javaScript本地缓存的方法我们主要讲述以下四种&#xff1a; cookiesessionStoragelocalStorageindexedDB cookie Cook…

【Python】python编程初探2---字符编码,输入和输出,初识数据类型

欢迎来CILMY23的博客 本篇主题为【Python】python编程初探2---字符编码&#xff0c;输入和输出&#xff0c;初识数据类型 个人主页&#xff1a;CILMY23-CSDN博客 Python系列专栏&#xff1a;​​​​​​​http://t.csdnimg.cn/rAsEH 上一篇博客&#xff1a;http://t.csdni…