利用Python自带PIL库扩展图片大小给图片加文字描述的方法示例


Posted in Python onAugust 08, 2017

前言

最近的一个项目中需要在图片上添加文字,使用了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()

原图

利用Python自带PIL库扩展图片大小给图片加文字描述的方法示例

改之后的图

利用Python自带PIL库扩展图片大小给图片加文字描述的方法示例

总结

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

参考资料:

  • PIL库帮助文档http://pillow.readthedocs.io/en/latest/reference/ImageFont.html?highlight=getsize
  • 加水印的学习 https://wanglu.info/1273.html
  • 扩展图片大小的学习 https://ask.helplib.com/1334235
  • 计算字符串像素的学习 http://blog.csdn.net/icamera0/article/details/50762050
Python 相关文章推荐
python实现rest请求api示例
Apr 22 Python
python3.4用循环往mysql5.7中写数据并输出的实现方法
Jun 20 Python
python复制列表时[:]和[::]之间有什么区别
Oct 16 Python
Python3爬虫学习入门教程
Dec 11 Python
对Pycharm创建py文件时自定义头部模板的方法详解
Feb 12 Python
关于python 跨域处理方式详解
Mar 28 Python
python怎么调用自己的函数
Jul 01 Python
解决pyinstaller 打包exe文件太大,用pipenv 缩小exe的问题
Jul 13 Python
Python实现定时监测网站运行状态的示例代码
Sep 30 Python
Python经典五人分鱼实例讲解
Jan 04 Python
Python3自带工具2to3.py 转换 Python2.x 代码到Python3的操作
Mar 03 Python
理解深度学习之深度学习简介
Apr 14 Python
利用python打印出菱形、三角形以及矩形的方法实例
Aug 08 #Python
Python正则表达式非贪婪、多行匹配功能示例
Aug 08 #Python
关于Python 3中print函数的换行详解
Aug 08 #Python
Python tkinter模块中类继承的三种方式分析
Aug 08 #Python
Python实现注册登录系统
Aug 08 #Python
Python实现读取TXT文件数据并存进内置数据库SQLite3的方法
Aug 08 #Python
Python3 适合初学者学习的银行账户登录系统实例
Aug 08 #Python
You might like
全国FM电台频率大全 - 26 西藏自治区
2020/03/11 无线电
PHP中使用Session配合Javascript实现文件上传进度条功能
2014/10/15 PHP
PHP获取数组的键与值方法小结
2015/06/13 PHP
7个鲜为人知却非常实用的PHP函数
2015/07/01 PHP
php实现无限级分类(递归方法)
2015/08/06 PHP
php计算多个集合的笛卡尔积实例详解
2017/02/16 PHP
js模仿jquery的写法示例代码
2013/06/16 Javascript
js取值中form.all和不加all的区别介绍
2014/01/20 Javascript
将HTML的左右尖括号等转义成实体形式的两种实现方式
2014/05/04 Javascript
鼠标左键单击冲突的问题解决方法(防止冒泡)
2014/05/14 Javascript
原生 JS Ajax,GET和POST 请求实例代码
2016/06/08 Javascript
jQuery.form.js插件不能解决连接超时(timeout)的原因分析及解决方法
2016/10/14 Javascript
Vuejs仿网易云音乐实现听歌及搜索功能
2017/03/30 Javascript
Vue的移动端多图上传插件vue-easy-uploader的示例代码
2017/11/27 Javascript
vue中改变选中当前项的显示隐藏或者状态的实现方法
2018/02/08 Javascript
原生js实现each方法实例代码详解
2019/05/27 Javascript
使用Vue开发自己的Chrome扩展程序过程详解
2019/06/21 Javascript
[48:37]EG vs OG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python装饰器使用实例:验证参数合法性
2015/06/24 Python
使用C#配合ArcGIS Engine进行地理信息系统开发
2016/02/19 Python
Python中在脚本中引用其他文件函数的实现方法
2016/06/23 Python
对python 匹配字符串开头和结尾的方法详解
2018/10/27 Python
对python过滤器和lambda函数的用法详解
2019/01/21 Python
用Cython加速Python到“起飞”(推荐)
2019/08/01 Python
利用pyecharts实现地图可视化的例子
2019/08/12 Python
python实现图片转字符画
2021/02/19 Python
CSS3 实用技巧:实现黑白图像效果示例代码
2013/07/11 HTML / CSS
美国最大的香水连锁店官网:Perfumania
2016/08/15 全球购物
构造方法和其他方法的区别
2016/04/26 面试题
银行求职推荐信范文
2013/11/30 职场文书
行政求职信
2014/07/04 职场文书
教师职位说明书
2014/07/29 职场文书
师范生免费教育协议书范本
2014/10/09 职场文书
工程安全生产协议书
2014/11/21 职场文书
解除劳动关系协议书2篇
2014/11/28 职场文书
python中%格式表达式实例用法
2021/06/18 Python