京公网安备 11010802034615号
经营许可证编号:京B2-20210330
利用Python自带PIL库扩展图片大小给图片加文字描述的方法示例
最近的一个项目中需要在图片上添加文字,使用了OpenCV,结果发现利用opencv给图像添加文字有局限。可利用的字体类型比较少,需要安装Freetype扩展,比较复杂。而且不能用putText函数输出中文,否则就会出现乱码的情况。只好选择使用Python PIL函数库对照片进行处理,利用Python自带的PIL库扩展图片大小给图片加上文字描述,大多都是库函数调用,只是给定图片宽度后计算文字所需行数的代码需要写。 代码比较丑,but it works.
代码示例
#!/usr/bin/env python3
from PIL import Image, ImageDraw, ImageFont
import math
text="尽管曾作为皇家猎场而存在,意大利大帕拉迪索国家公园一直保留着其野性的一面。画面里的赤狐静静地匍匐在秋草丛中等待时机,它的身躯与自然融为一体。所有狐狸都是机会主义者,生活在大帕拉迪索的赤狐也不例外;如果有可能,无论是鱼类还是野兔,即便是人类野餐留下的残羹冷炙,它们也不介意吃个一干二净。"
def make_text_image(width, white, text, save_path, mode = "rgb"):
"""
生成一个文字图形, white=1,表示白底黑字,否则为黑底白字
"""
# 字体可能要改
# linux查看支持的汉字字体 # fc-list :lang=zh
ft = ImageFont.truetype("DroidSansFallbackFull.ttf", 15)
w, h = ft.getsize(text)
# 计算要几行
lines = math.ceil(w / width) + 1
height = h * lines
# 一个汉字的宽度
one_zh_width, h = ft.getsize("中")
if len(mode) == 1: # L, 1
background = (255)
color = (0)
if len(mode) == 3: # RGB
background = (255, 255, 255)
color = (0,0,0)
if len(mode) == 4: # RGBA, CMYK
background = (255, 255, 255, 255)
color = (0,0,0,0)
newImage = Image.new(mode, (width, height), background if white else color)
draw = ImageDraw.Draw(newImage)
# 分割行
text = text + " " #处理最后少一个字问题
text_list = []
start = 0
end = len(text) - 1
while start < end:
for n in range(end):
try_text = text[start:start+n]
w,h = ft.getsize(try_text)
if w + 2*one_zh_width > width:
break
text_list.append(try_text[0:-1])
start = start + n - 1;
# print(text_list)
i = 0
for t in text_list:
draw.text((one_zh_width, i * h), t, color if white else background, font=ft)
i = i + 1
newImage.save(save_path);
def resize_canvas(org_image="aa.jpg", add_image="222.jpg", new_image_path="save2.jpg"):
org_im = Image.open(org_image)
org_width, org_height = org_im.size
mode = org_im.mode
make_text_image(org_width, 0, text, "222.jpg", mode)
add_im = Image.open(add_image)
add_width, add_height = add_im.size
mode = org_im.mode
newImage = Image.new(mode, (org_width, org_height + add_height))
newImage.paste(org_im, (0, 0, org_width, org_height))
newImage.paste(add_im, (0, org_height, add_width, add_height + org_height))
newImage.save(new_image_path)
resize_canvas()
原图
改之后的图
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
在数据清洗、统计分析与数据质量检测工作中,箱型图(又称箱线图、Box Plot)是最直观、最高效的可视化分析工具之一。相较于柱状 ...
2026-05-25在大数据分析、数据清洗、质量管控、风险监测等领域,异常数据识别是保障数据质量、确保分析结论精准、规避业务决策失误的核心基 ...
2026-05-25 很多数据分析师精通Excel函数和透视表,但当被问到“数据从哪里来”“表和视图有什么区别”“数据库管理系统和SQL是什么关系 ...
2026-05-25数字化经营时代,企业的市场竞争早已从经验决策转向数据决策。门店营收、用户转化、产品销量、成本损耗、存量资产等所有经营行为 ...
2026-05-22在MySQL数据库日常运维、业务数据校验、数据迁移与数据清洗场景中,自增主键ID的连续性校验是一项基础且关键的工作。MySQL的Auto ...
2026-05-22 很多企业团队并非缺乏指标,而是陷入“指标失控”:仪表盘上堆满实时跳动的数据,却无法回答“当前瓶颈在哪、下一步该做什么 ...
2026-05-22【核心关键词】大数据、可视化、存储、架构、客户、离线、产品、同步、实时、数据仓库、数据分析、数据可视化、存储数据、离线 ...
2026-05-21在电商流量红利消退、公域获客成本持续走高的当下,存量用户深度挖掘已成为店铺增收增效的核心抓手。相较于付费投放获取的陌生新 ...
2026-05-21 很多数据分析师每天盯着几十个指标,但当被问到“这套指标要支撑什么业务目标”“指标之间是什么逻辑关系”“业务变化时如何 ...
2026-05-21在数据驱动决策的时代,数据质量直接决定分析结果的可靠性与准确性,而异常值作为数据清洗中的核心痛点,往往会扭曲分析结论、误 ...
2026-05-20 很多数据分析师每天盯着GMV、DAU、转化率,但当被问到“哪些指标在所有行业都适用”“哪些指标只对电商有意义”“二者如何搭 ...
2026-05-20Agent的能力边界,很大程度上取决于其掌握的Skill质量和数量。传统做法是靠人工编写和维护Skill,但这条路很快会遇到瓶颈。业务 ...
2026-05-20在统计分析中,方差分析(ANOVA)是一种常用的假设检验方法,核心用于分析“一个或多个自变量对单个因变量的影响”,广泛应用于 ...
2026-05-19 很多数据分析师每天盯着GMV、DAU、转化率,但当被问到“什么是指标”“指标和维度有什么区别”“如何定义指标值的计算规则和 ...
2026-05-19想高效备考 CDA 一级,拒绝盲目刷题、冗余学习?《CDA 一级教材知识手册》重磅来袭!以官方教材为核心,浓缩 13 章 103 个核心考 ...
2026-05-19在数据统计分析中,卡方检验是一种常用的非参数检验方法,核心用于判断两个或多个分类变量之间是否存在显著关联,广泛应用于市场 ...
2026-05-18在企业数字化转型的浪潮中,很多企业陷入了“技术堆砌”的误区——上线了ERP、CRM、BI等各类系统,积累了海量数据,却依然面临“ ...
2026-05-18小陈是某电商平台的数据分析师。老板交给他一个任务:“我们平台的注册用户已经突破1000万了,想了解一下用户的平均月消费金额。 ...
2026-05-18【专访摘要】本次CDA持证专访邀请到拥有丰富物流供应链数据分析经验的赖尧,他结合自身在京东、华莱士、兰格赛等企业的从业经历 ...
2026-05-15在数字化时代,企业的每一次业务优化、每一项技术迭代,都需要回答一个核心问题:这个动作到底能带来多少价值?是提升了用户转化 ...
2026-05-15