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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在FMEA风险控制中,首检的重要性!——SunFMEA软件

在制造业中,FMEA被广泛应用于产品设计、生产过程和产品服务的各个阶段。而首检,作为生产过程中的一个重要环节,同样承载着风险控制和质量保障的重任。 今天SunFMEA软件系统从FMEA风险控制的角度来看,首检具有至关重要的地位。首检…

VS Code配置C/C++环境

1.插件安装完之后最好重启一下软件,这样就可以对插件的配置进行修改 2.配置C/C环境按这篇博客来,基本就能成功。 【C/C】vscode配置C/C环境-CSDN博客 3. 参见: win10下vscode配置c语言环境-阿里云开发者社区 (aliyun.com)

蓝牙耳机什么牌子好?拒绝跟风购买!五大良心品牌推荐

​真无线蓝牙耳机已经成为我们日常生活中不可或缺的数码产品。随着技术的发展,人们对蓝牙耳机的要求越来越高,不仅要求音质出众,还希望长时间佩戴也能保持舒适,并能适应多种使用场景。挑选蓝牙耳机确实需要一些技巧。所以&#xf…

linux 网卡配置 vlan/bond/bridge/macvlan/ipvlan 模式

linux 网卡模式 linux网卡支持非vlan模式、vlan模式、bond模式、bridge模式,macvlan模式、ipvlan模式等,下面介绍交换机端及服务器端配置示例。 前置要求: 准备一台物理交换机,以 H3C S5130 三层交换机为例准备一台物理服务器&…

中科数安——企业文件资料防泄密|数据防泄密|透明加密系统|源代码防泄露

#文件防泄密软件# 中科数安作为领先的信息安全解决方案提供商,专注于为企业及机构提供全面的文件资料防泄密和数据防泄漏解决方案,具体产品和服务涵盖以下几个方面: 中科数安 || 文件资料、数据防泄密系统 PC地址:www.weaem.com …

2024高安全个人密码本程序源码 可生成随机密码/备忘录/二代密码(带安装教程)

Youngxj Pwd 您的贴身密码管家 在这个网络发达的年代,人人都需要上网,一旦上网就不难避免需要用到账号密码,在账号众多的情况下,你是否还在为你复杂难记的密码担忧着,现在只需要记录一次,就可以随时查看你的…

YOLO中的预训练模型是否需要

这张图片显示的是使用YOLOv5(一种流行的物体检测算法)进行训练时的一段命令行指令以及对应的注释,这些注释是中文的。这里列出的是两个不同情况下的命令行用法。 上面的命令: python train.py --data custom.yaml --weights yolo…

【小黑送书—第十四期】>>重磅升级——《Excel函数与公式应用大全》(文末送书)

今天给大家带来AI时代系列书籍:《Excel 2019函数与公式应用大全》全新升级版,Excel Home多位微软全球MVP专家打造,精选Excel Home海量案例,披露Excel专家多年研究成果,让你分分钟搞定海量数据运算! 由北京…

20240326,文件,格式化文件输入输出,二进制文件

一&#xff0c;文件 1.1 格式化输入和输出 1.1.1 FLAG -左对齐 在前面放或— (SPACE) 正数留空 0-0填充 //%[flag][width][.prec][hIL]type #include<stdio.h> int main(int argc,char const *argv[]){int i1234;printf("%d\n",i);printf…

AI论文速读 | 【综述】用于轨迹数据管理和挖掘的深度学习:综述与展望

论文标题&#xff1a;Deep Learning for Trajectory Data Management and Mining: A Survey and Beyond 作者&#xff1a;Wei Chen(陈伟), Yuxuan Liang(梁宇轩), Yuanshao Zhu, Yanchuan Chang, Kang Luo, Haomin Wen(温皓珉), Lei Li, Yanwei Yu(于彦伟), Qingsong Wen(文青…

借力AI+视频号电商,腾讯广告业务这驾马车能跑多远?

腾讯的“功劳簿”又添上了几笔。 日前&#xff0c;腾讯披露了2023年四季度及全年财报。报告显示&#xff0c;2023年&#xff0c;腾讯营收6090.15亿元&#xff0c;同比增长10%&#xff1b;调整后净利润&#xff08;Non-IFRS&#xff09;1576.88亿元&#xff0c;同比增长36%。 …

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可能有重复的变量名…

聚酰亚胺PI材料难于粘接,用什么胶水粘接?那么让我们先一步步的从认识它开始(十): 聚酰亚胺PI薄膜的用途是什么

聚酰亚胺PI薄膜的用途是什么 聚酰亚胺&#xff08;Polyimide&#xff0c;简称PI&#xff09;薄膜由于其独特的性能&#xff0c;被广泛用于多个领域。聚酰亚胺薄膜市场可分为挠性电路板(FPC)、特种制品、压敏胶带、电机/发电机、电线电缆等。目前在国内各类下游需求中&#xff…

HTML(一)---【基础】

零.前言&#xff1a; 本文章对于HTML的基础知识处理的十分细节&#xff0c;适合从头学习的初学者&#xff0c;亦或是想要提升基础的前端工程师。 1.什么是HTML&#xff1f; HTML是&#xff1a;“超文本标签语言”&#xff08;Hyper Text Markup Language&#xff09; HTML不…

如何提升买家对独立站的信任感?提升转化率的技巧

跨境电商独立站获得爆发式增长&#xff0c;有越来越多的商家开始尝试建自己的独立站。同时我们在社群里获得反馈&#xff0c;很多商家在建站初期&#xff0c;普遍都会面临一个问题&#xff1a; 好不容易从各个渠道引流到独立站&#xff0c;转化率却不高&#xff0c;没有订单。 …

探究网络延迟对事务的影响

1.背景概述 最近在做数据同步测试&#xff0c;需要通过DTS将kafka中的数据同步到数据库中&#xff0c;4G的数据量同步到数据库用了大约4个多小时&#xff0c;这看起来并不合理&#xff1b;此时查看数据库所在主机的CPU&#xff0c;IO的使用率都不高&#xff0c;没有瓶颈&#…

爬虫技术与IP代理池:数据采集的利器

文章目录 1、 爬虫技术的概念和原理1.1 爬虫的角色&#xff1a;1.2 爬虫的工作流程&#xff1a;1.3技术挑战和解决方案&#xff1a; 2、 IP代理池的功能和优势2.1 功能描述&#xff1a;2.2 优势描述&#xff1a;2.3 应用场景&#xff1a; 3、 IP代理池推荐 在当今数字化时代&am…

两种利用matplotlib绘制无填充的多边形的方法:ax.fill()和Polygon

两种利用matplotlib绘制无填充的多边形的方法&#xff1a;ax.fill()和Polygon 下面我们将使用np.rand随机生成5个多边形的顶点&#xff0c;使用不同的方法绘制多边形。 ax.fill()绘制多边形 函数原型为&#xff1a; Axes.fill(*args, dataNone, **kwargs) args参数指的是按x…

hadoop安装及基本使用

环境准备 三台centos7虚拟机&#xff0c;设置固定ip&#xff08;自己设置&#xff09;&#xff0c;设置ssh秘密登录&#xff08;自己设置&#xff09;&#xff0c;安装jdk8&#xff08;自己安装&#xff09; 准备安装包hadoop-3.3.6.tar.gz 位置在/home/hadoop 准备服务器之间…

【线段树二分】第十三届蓝桥杯省赛C++ A组/研究生组 Python 研究生组《扫描游戏》(C++)

【题目描述】 有一根围绕原点 O 顺时针旋转的棒 OA&#xff0c;初始时指向正上方&#xff08;Y 轴正向&#xff09;。 在平面中有若干物件&#xff0c;第 i 个物件的坐标为&#xff08;,)&#xff0c;价值为 。 当棒扫到某个物件时&#xff0c;棒的长度会瞬间增长 &#xff…