前言

使用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图片添加好看的中文字体并根据图片动态改变文字大小相关推荐

  1. python使用fpdf创建pdf文件包含:页眉、页脚并嵌入logo图片、设置使用中文字体

    python使用fpdf创建pdf文件包含:页眉.页脚并嵌入logo图片.设置使用中文字体 #python使用fpdf创建页眉.页脚并嵌入logo图片.设置使用中文字体 from fpdf impor ...

  2. Ubuntu16.04 下python的matplotlib库加入中文字体(微软雅黑)

    Ubuntu16.04 下python的matplotlib库加入中文字体 一.首先安装微软雅黑字体 1.下载或者拷贝微软雅黑字体 2.将待安装的字体复制到Ubuntu下面的字体位置`/usr/sha ...

  3. Python实现图片添加水印(支持中文、英文和图片)

    欢迎关注个人公众号 DailyJobOps 阅读大纲 图片水印忽大忽小问题研究 中文水印乱码问题 水印的动态展示 背景 在上次CSDN中发表技术文章的时候,文章中涉及到图片,CSDN会自动上传然后添加 ...

  4. 使用Spire.xls将excel转为pdf、图片等,解决中文字体缺失

    参考 下载免费版jar包地址: http://repo.e-iceblue.com/nexus/content/groups/public/e-iceblue/spire.xls.free/ 官网教程 ...

  5. POI 生成word各类问题(设置中文字体,重复图片插入等怪问题......)

    一.设置字体(中文) // 创建 段落 XWPFParagraph xp = j.addParagraph(); // 创建 XWPFRun 对象 XWPFRun title = xp.createR ...

  6. Ubuntu12.04安装中文字体,解决导出图片乱码

    Tomcat程序运行的JAVA程序,在导出图片时,会出现中文乱码,也给Tomcat server.xml中指定URIEncoding="UTF-8"参数了,也无效. 这是因为Tom ...

  7. php gd库扩展生成带中文字体的png图片

    注意中文字体的话,需要首先安装字体库才行,这里以楷体字为例,来生成图片 apt-get install fonts-cwtex-kai find -name *kai*.ttf ./usr/share ...

  8. excalidraw 添加手绘中文字体

    Excalidraw是一个矢量绘图工具,支持在绘图中添加文字.Excalidraw目前支持一些常见的中文字体,例如微软雅黑.宋体等.如果你想添加其他的手绘中文字体,可以按照以下步骤进行操作: 打开Ex ...

  9. php 如何给字体加颜色,怎么给字体加背景图片?如何给文字填充图片背景色?怎么给字体加背景图片?文字加背景图...

    下了两天的雨,今天终于放晴了,而且还是阴天的天气,有微风,没有热辣的太阳,这让小编不禁感到了一股秋的凉意呢~啊哈哈哈,好啦,还是不说废话了,来看看今天的教程方案吧!平时我们制作纯文字的图片画面,文字的 ...

  10. php 给图片添加链接_【dreamweaver给图片添加链接】用dreamweaver 怎样给图片局部地区添加超链接?...

    dreamweaver给图片添加链接教程: 1.打开Dreamweaver.如果尚未打开一个现有文件或定义一个新站点并创建一个新HTML文件,请执行以下操作. 2.创建新的HTML文件时,Dreamw ...

最新文章

  1. 植树节准备中:合种樟子松、华山松和云杉
  2. R构建层次聚类模型(Hierarchical Clustering)
  3. Linux0.11 创建进程的过程分析--fork函数的使用
  4. 【AIX 命令学习】lsattr 显示一个给定设备或一种设备的属性
  5. 计算机语言学 自然语言处理程序,利用知网进行(计算机)自然语言处理
  6. impdp导入dmp文件ORA-39088: 文件名不能包含路径说明ORA-39001: 参数值无效ORA-39000: 转储文件说明错误
  7. android 自定义 对号,Android自定义View实现打钩动画功能
  8. 学习笔记之加密解密,PKI,CA
  9. Android系统信息获取 之一:系统存储信息的获取(RAM,ROM,SDCard)
  10. 2022IC秋招面经分享【禾赛科技·FPGA开发工程师(上海)】
  11. 超详细,如何不用任何第三方软件实现电脑与手机文件传输
  12. 【已解决】 Unable to attach or mount volumes: unmounted volumes
  13. 某鉴黄师:“我并不幸福”,AI加持下CDN鉴黄又是何物?
  14. MySQL与Redis的双写一致性解决方案
  15. 今日头条前端实习面试经验
  16. 网页设计与制作第一课:什么是html,html基础与文本控制标记
  17. 转载 电子工程师的程序人生历程
  18. 有源医疗器械的开发过程和各阶段的注意事项(六)——有源医疗器械研发涉及到的标准总结与介绍
  19. 不管你学的是什么专业,你都应该多少懂些管理学的东西之【罗森塔尔效应】【虚假同感偏差】...
  20. 又附体了!黄健翔的确没有错!(ZZ)

热门文章

  1. Rhino for Mac Essential Training Mac平台的Rhino基础教程 Lynda课程中文字幕
  2. html5 调用unity,Unity调用UniWebView打开H5界面脚本
  3. linux shell执行perl脚本,无法在Shell脚本中运行Perl脚本
  4. 用拼音输入法字典库实现同音字模糊查询
  5. Ubuntu14.04 64位 JAVA Eclipse ADT AndroidStudio 安装
  6. Linux 安装 RMVB,rm,ape文件 解码器
  7. PADS2007常用快捷键
  8. 数值分析第八章知识点总结——常微分方程数值解法
  9. Excel函数实战技巧精粹(六)如何在条件格式中使用函数
  10. Python yolo 神经网络实现视频中的行人车辆检测计数(车流量统计)YOLO多目标跟踪与计数