Python图片添加好看的中文字体并根据图片动态改变文字大小
前言
使用opencv或者PIL在图片上写英文字是非常容易的,但是写中文字时却会出现乱码或者写出来的字特别丑,如何在图片中写出自己想要的好看的字体就是本节会详细介绍的。同时我们可能会遇到一些需求,例如输入的图片大小并不是每次都是一致的,若是重复使用同一大小的字体,在面对不同图片时就会出现过大或过小不清晰的情况,如果让展示字体会随着图片的大小动态改变也是本节会详细介绍的。话不多说,先展示代码与效果
Code and Performance
import numpy as np
import cv2
from PIL import Image, ImageDraw, ImageFontdef cv2AddChineseText(img, text, position, fontpath, textColor=(0, 255, 0), textSize=60):"""取自别人博客,暂时找不到博客地址了用于给图片添加文字"""if (isinstance(img, np.ndarray)): # 判断是否OpenCV图片类型img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))# 创建一个可以在给定图像上绘图的对象draw = ImageDraw.Draw(img)# 字体的格式fontStyle = ImageFont.truetype(fontpath, textSize, encoding="utf-8")# 绘制文本draw.text(position, text, textColor, font=fontStyle)# 转换回OpenCV格式return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)def get_font_size(img_fraction, photo, text, fontsize, font_path):"""摘自Nachtalb的回答https://cloud.tencent.com/developer/ask/sof/87148获取给定图片比例下的最合适大小"""font = ImageFont.truetype(font_path, fontsize)# 输入photo [height, width, channel]breakpoint = img_fraction * photo.shape[1]jumpsize = 75while True:# font.getsize() 可以获得当前文本所占图片大小,维度是[width, height]# 用二分查找的方式搜索在给定比例下的最合适的sizeif font.getsize(text)[0] < breakpoint:fontsize += jumpsizeelse:jumpsize = jumpsize // 2fontsize -= jumpsizefont = ImageFont.truetype(font_path, fontsize)if jumpsize <= 1:breakreturn fontsize, font.getsize(text)#设置font路径,需要输入文本
font_path = "C:\Windows\Fonts\STKAITI.TTF"
text = f'你好世界,拥抱太阳'
# 创建一张空白的图 [800 × 800]
# 注意用numpy生成空白图片时,类型必须为np.uint8
imgsize = 1000
img = np.ones((imgsize, imgsize, 3), dtype=np.uint8) * 255
# font从1开始
fontsize, font_region = get_font_size(img_fraction=0.5, photo=img,text=text, fontsize=1,font_path=font_path)
img = cv2AddChineseText(img, text, position=(0,0), textColor=(0,0,0),textSize=fontsize, fontpath=font_path)# 展示图片
cv2.namedWindow("match results", 0)
cv2.resizeWindow("match results", 960, 640)
cv2.imshow('match results', img)
cv2.waitKey(5000)
cv2.destroyAllWindows()
整体思路
对于在图片中写出好看的字体,其重点就在于字体文件,我在这里使用的时windows自带的华文楷体,这个字体我觉得挺好看的,比固定的simhei的要看的多,事实上只要时ttf,ttc
格式的字体文件,PIL都可以使用,因此大家可以选择好看的字体,并调用就可以了
然后就是字体的动态缩放,在例子中我们使用的比例是图片的一半,因此不管图片大小如何改变,文字的宽度始终会占图片的一半,而使用的方法是二分查找,直到查到合适的字体大小。
结论
通过PIL可以方便的在图片上写出好看的字体,并且只要有字体,不管什么国家的文字都可以展示,还可以通过动态调整字体大小的方式,让文本在不同分辨率的图片上,清晰的展示出来
参考
PIL如何根据图像大小缩放文本大小
Python图片添加好看的中文字体并根据图片动态改变文字大小相关推荐
- python使用fpdf创建pdf文件包含:页眉、页脚并嵌入logo图片、设置使用中文字体
python使用fpdf创建pdf文件包含:页眉.页脚并嵌入logo图片.设置使用中文字体 #python使用fpdf创建页眉.页脚并嵌入logo图片.设置使用中文字体 from fpdf impor ...
- Ubuntu16.04 下python的matplotlib库加入中文字体(微软雅黑)
Ubuntu16.04 下python的matplotlib库加入中文字体 一.首先安装微软雅黑字体 1.下载或者拷贝微软雅黑字体 2.将待安装的字体复制到Ubuntu下面的字体位置`/usr/sha ...
- Python实现图片添加水印(支持中文、英文和图片)
欢迎关注个人公众号 DailyJobOps 阅读大纲 图片水印忽大忽小问题研究 中文水印乱码问题 水印的动态展示 背景 在上次CSDN中发表技术文章的时候,文章中涉及到图片,CSDN会自动上传然后添加 ...
- 使用Spire.xls将excel转为pdf、图片等,解决中文字体缺失
参考 下载免费版jar包地址: http://repo.e-iceblue.com/nexus/content/groups/public/e-iceblue/spire.xls.free/ 官网教程 ...
- POI 生成word各类问题(设置中文字体,重复图片插入等怪问题......)
一.设置字体(中文) // 创建 段落 XWPFParagraph xp = j.addParagraph(); // 创建 XWPFRun 对象 XWPFRun title = xp.createR ...
- Ubuntu12.04安装中文字体,解决导出图片乱码
Tomcat程序运行的JAVA程序,在导出图片时,会出现中文乱码,也给Tomcat server.xml中指定URIEncoding="UTF-8"参数了,也无效. 这是因为Tom ...
- php gd库扩展生成带中文字体的png图片
注意中文字体的话,需要首先安装字体库才行,这里以楷体字为例,来生成图片 apt-get install fonts-cwtex-kai find -name *kai*.ttf ./usr/share ...
- excalidraw 添加手绘中文字体
Excalidraw是一个矢量绘图工具,支持在绘图中添加文字.Excalidraw目前支持一些常见的中文字体,例如微软雅黑.宋体等.如果你想添加其他的手绘中文字体,可以按照以下步骤进行操作: 打开Ex ...
- php 如何给字体加颜色,怎么给字体加背景图片?如何给文字填充图片背景色?怎么给字体加背景图片?文字加背景图...
下了两天的雨,今天终于放晴了,而且还是阴天的天气,有微风,没有热辣的太阳,这让小编不禁感到了一股秋的凉意呢~啊哈哈哈,好啦,还是不说废话了,来看看今天的教程方案吧!平时我们制作纯文字的图片画面,文字的 ...
- php 给图片添加链接_【dreamweaver给图片添加链接】用dreamweaver 怎样给图片局部地区添加超链接?...
dreamweaver给图片添加链接教程: 1.打开Dreamweaver.如果尚未打开一个现有文件或定义一个新站点并创建一个新HTML文件,请执行以下操作. 2.创建新的HTML文件时,Dreamw ...
最新文章
- 植树节准备中:合种樟子松、华山松和云杉
- R构建层次聚类模型(Hierarchical Clustering)
- Linux0.11 创建进程的过程分析--fork函数的使用
- 【AIX 命令学习】lsattr 显示一个给定设备或一种设备的属性
- 计算机语言学 自然语言处理程序,利用知网进行(计算机)自然语言处理
- impdp导入dmp文件ORA-39088: 文件名不能包含路径说明ORA-39001: 参数值无效ORA-39000: 转储文件说明错误
- android 自定义 对号,Android自定义View实现打钩动画功能
- 学习笔记之加密解密,PKI,CA
- Android系统信息获取 之一:系统存储信息的获取(RAM,ROM,SDCard)
- 2022IC秋招面经分享【禾赛科技·FPGA开发工程师(上海)】
- 超详细,如何不用任何第三方软件实现电脑与手机文件传输
- 【已解决】 Unable to attach or mount volumes: unmounted volumes
- 某鉴黄师:“我并不幸福”,AI加持下CDN鉴黄又是何物?
- MySQL与Redis的双写一致性解决方案
- 今日头条前端实习面试经验
- 网页设计与制作第一课:什么是html,html基础与文本控制标记
- 转载 电子工程师的程序人生历程
- 有源医疗器械的开发过程和各阶段的注意事项(六)——有源医疗器械研发涉及到的标准总结与介绍
- 不管你学的是什么专业,你都应该多少懂些管理学的东西之【罗森塔尔效应】【虚假同感偏差】...
- 又附体了!黄健翔的确没有错!(ZZ)
热门文章
- Rhino for Mac Essential Training Mac平台的Rhino基础教程 Lynda课程中文字幕
- html5 调用unity,Unity调用UniWebView打开H5界面脚本
- linux shell执行perl脚本,无法在Shell脚本中运行Perl脚本
- 用拼音输入法字典库实现同音字模糊查询
- Ubuntu14.04 64位 JAVA Eclipse ADT AndroidStudio 安装
- Linux 安装 RMVB,rm,ape文件 解码器
- PADS2007常用快捷键
- 数值分析第八章知识点总结——常微分方程数值解法
- Excel函数实战技巧精粹(六)如何在条件格式中使用函数
- Python yolo 神经网络实现视频中的行人车辆检测计数(车流量统计)YOLO多目标跟踪与计数