专栏首页算法猿的成长如何在图片上添加文本信息

如何在图片上添加文本信息

前言

给图片添加文本信息是非常常见的需求,通常需要添加的文本信息分为中文文字或者是非中文的文字,比如数字和英文,对这两类的实现方法也有所不同,非中文的文本信息可以直接用 opencv 实现,而中文文本需要使用 PIL ,因为 opencv 不支持中文。

所以接下来就分别介绍这两种实现方法。

opencv 添加文本信息

opencv 添加文本信息的函数是 putText ,实现代码如下所示,这个函数的参数主要是:

  • img:原图
  • text:需要添加的文字
  • position:文字起始的位置,tuple 元组类型
  • font: 字体类型,这里用了默认字体,实际上还有其他几种字体,具体可以查看官方文档:https://docs.opencv.org/2.4/modules/core/doc/drawing_functions.html#void%20putText(Mat&%20img,%20const%20string&%20text,%20Point%20org,%20int%20fontFace,%20double%20fontScale,%20Scalar%20color,%20int%20thickness,%20int%20lineType,%20bool%20bottomLeftOrigin
  • font_scale: 字体大小
  • font_color:字体的颜色
  • thickness: 线的粗细
import cv2
%matplotlib inline
import matplotlib.pyplot as plt

# opencv 
img = cv2.imread('plane.jpg')
# 添加的文字
text = 'plane'
# 文字起始的位置
position = (600, 100)
# 字体大小
font_scale = 3
# 字体颜色
font_color = (0, 0, 255)
# 默认字体
font=cv2.FONT_HERSHEY_SIMPLEX
# 线的粗细
thickness = 3
cv2.putText(img, text, position, font, font_scale, font_color, thickness, cv2.LINE_AA)
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))

结果如下所示:


PIL 添加中文文本信息

如果是中文文字,那么就必须用 PIL 来实现了,同样先上实现的代码:

from PIL import Image, ImageDraw, ImageFont
%matplotlib inline
import matplotlib.pyplot as plt

# PIL 绘制中文
img = Image.open('plane.jpg')
# 自定义字体
font = ImageFont.truetype("/System/Library/Fonts/PingFang.ttc", 60)
draw = ImageDraw.Draw(img)
# 文字起始坐标
position = (600, 100)
# 文字
text = '纸飞机'
# 文字颜色
color = (0, 0, 255)
draw.text(position, text, font=font, fill=color)
plt.imshow(img)

结果如下所示:

基本的参数其实和 opencv 的函数一样,同样需要指定文字、字体、起始位置、字体大小和颜色,其中字体可以是自定义的字体,在官方文档中给出了不同系统自带字体存放的位置:

  • windows:在 c:\Windows\Fonts\
  • mac:/Library/Fonts/, /System/Library/Fonts/ 或者是 ~/Library/Fonts/
  • linux: 在 /usr/share/fonts/

https://pillow.readthedocs.io/en/stable/reference/ImageFont.html#PIL.ImageFont.truetype

本文分享自微信公众号 - 算法猿的成长(AI_Developer),作者:kbsc13

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-05-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 每日一学:如何读取网络图片

    这里要读取的网络图片,来自上一篇文章:每日一学:如何用matplotlib展示图片:

    材ccc
  • [实战]制作简单的公众号二维码关注图

    最近刚刚更换了公众号名字,然后自然就需要更换下文章末尾的二维码关注图,但是之前是通过 windows 自带的画图软件做的,但是之前弄的时候其实还是比较麻烦的,所...

    材ccc
  • 如何转换png图片为jpg图片

    最近在工作中会遇到需要将 png 图片转换为 jpg 图片的需求,主要原因也是 png 图片占的空间太大,如果图片数量上万张,可能就需要十几G的存储空间,所以希...

    材ccc
  • 【前端开发系列】—— 文字阴影与样式

    id与class的区别 id是这个界面唯一的元素,标识某个特定的容器,比如div等等。而class是一种样式,可以应用与多个div。 另外他们在配置CSS也是不...

    用户1154259
  • iconfont关于content值的坑

    font-carrier是一个功能强大的字体操作库,使用它你可以随心所欲的操作字体。让你可以在svg的维度改造字体的展现形状。

    IMWeb前端团队
  • 既之前的基础,先写个简单的PHP 与数据库 的数据交流

    现在先不用 css 和 javascript     先用纯 html  php  写吧。 所以那些 嵌入式 <font  size=....  什么的看看就算...

    书童小二
  • The Clean Architecture in PHP 读书笔记(一)

    框架是非常好的,可以帮助我们快速的开发,但是前期的学习成本往往很高,特别是如果想要深入理解框架,需要花费大量的经历。

    zhuanxu
  • Visual Studio对程序集签名时一个很不好用的地方

    由于我们的项目底层使用到一个通过LogicalCallContext实现的上下文数据管理框架,导致所有的Unit Test不能正常运行。具体的现象在《只在Uni...

    蒋金楠
  • 『教程』微信小程序webview的使用

    小程序 微信小程序是一种全新的连接用户与服务的方式,它可以在微信内被便捷地获取和传播,同时具有出色的使用体验。同时提供一系列工具帮助开发者快速接入并完成小程序开...

    极乐君
  • centOS7 mini配置linux服务器(二) 配置IP

    1.登录root用户,输入指令  #ip addr 可以看到除lo外的属于你的网卡配置。 ? 2.输入 #cd /etc/sysconfig/network-...

    生活创客

扫码关注云+社区

领取腾讯云代金券