利用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实现批量读取word中表格信息的方法
Jul 30 Python
Python 列表排序方法reverse、sort、sorted详解
Jan 22 Python
使用Python写CUDA程序的方法
Mar 27 Python
Python升级导致yum、pip报错的解决方法
Sep 06 Python
TensorFlow如何实现反向传播
Feb 06 Python
Django ORM 自定义 char 类型字段解析
Aug 09 Python
Python自动化导出zabbix数据并发邮件脚本
Aug 16 Python
python中如何实现将数据分成训练集与测试集的方法
Sep 13 Python
python selenium实现发送带附件的邮件代码实例
Dec 10 Python
Python 实现数组相减示例
Dec 27 Python
浅谈keras中自定义二分类任务评价指标metrics的方法以及代码
Jun 11 Python
彻底搞懂python 迭代器和生成器
Sep 07 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
Php中文件下载功能实现超详细流程分析
2012/06/13 PHP
PHP+Mysql基于事务处理实现转账功能的方法
2015/07/08 PHP
thinkPHP的表达式查询用法详解
2016/09/14 PHP
PHP编程计算两个时间段是否有交集的实现方法(不算边界重叠)
2017/05/30 PHP
jQuery 判断元素上是否绑定了事件
2009/10/28 Javascript
关于Javascript 对象(object)的prototype
2014/05/09 Javascript
jQuery插件简单学习实例教程
2016/07/01 Javascript
在web中js实现类似excel的表格控件
2016/09/01 Javascript
jQuery.Form上传文件操作
2017/02/05 Javascript
微信小程序手势操作之单触摸点与多触摸点
2017/03/10 Javascript
JavaScript实现前端分页控件
2017/04/19 Javascript
Vue.js实现一个SPA登录页面的过程【推荐】
2017/04/29 Javascript
详解vue-router 2.0 常用基础知识点之router.push()
2017/05/10 Javascript
jQuery自定义多选下拉框效果
2017/06/19 jQuery
解决vue this.$forceUpdate() 处理页面刷新问题(v-for循环值刷新等)
2018/07/26 Javascript
vue引入axios同源跨域问题
2018/09/27 Javascript
Angular resolve基础用法详解
2018/10/03 Javascript
[39:32]2014 DOTA2国际邀请赛中国区预选赛 TongFu VS DT 第二场
2014/05/23 DOTA
深入讨论Python函数的参数的默认值所引发的问题的原因
2015/03/30 Python
Python新手们容易犯的几个错误总结
2017/04/01 Python
PyCharm在win10的64位系统安装实例
2017/11/26 Python
python opencv 图像尺寸变换方法
2018/04/02 Python
Python 多线程不加锁分块读取文件的方法
2018/12/11 Python
由面试题加深对Django的认识理解
2019/07/19 Python
Python如何实现的二分查找算法
2020/05/27 Python
opencv 形态学变换(开运算,闭运算,梯度运算)
2020/07/07 Python
浅谈Selenium 控制浏览器的常用方法
2020/12/04 Python
希尔顿酒店官方网站:Hilton Hotels
2017/06/01 全球购物
亚洲最大旅游体验平台:KKday
2017/10/21 全球购物
英国Boots旗下太阳镜网站:Boots Designer Sunglasses
2018/07/07 全球购物
Bloomingdale’s阿联酋:选购奢华时尚、美容及更多
2020/09/22 全球购物
保送生自荐信范文
2013/10/06 职场文书
银行营业厅大堂经理岗位职责
2014/01/06 职场文书
会计工作态度自我评价
2015/03/06 职场文书
教务处干事工作总结
2015/08/14 职场文书
长辈生日祝福语大全(72句)
2019/08/09 职场文书