利用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中字典和JSON互转操作实例
Jan 19 Python
Python实现Kmeans聚类算法
Jun 10 Python
解决python写入mysql中datetime类型遇到的问题
Jun 21 Python
Linux下多个Python版本安装教程
Aug 15 Python
python消除序列的重复值并保持顺序不变的实例
Nov 08 Python
Python基于datetime或time模块分别获取当前时间戳的方法实例
Feb 19 Python
深入解析python中的实例方法、类方法和静态方法
Mar 11 Python
python中对数据进行各种排序的方法
Jul 02 Python
python图形绘制奥运五环实例讲解
Sep 14 Python
基于Python的自媒体小助手---登录页面的实现代码
Jun 29 Python
Scrapy爬虫文件批量运行的实现
Sep 30 Python
使用PyCharm官方中文语言包汉化PyCharm
Nov 18 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
德劲1103的维修打理经验
2021/03/02 无线电
一段实用的php验证码函数
2016/05/19 PHP
超强多功能php绿色集成环境详解
2017/01/25 PHP
PHP读取目录树的实现方法分析
2019/03/22 PHP
PHP全局使用Laravel辅助函数dd
2019/12/26 PHP
ThinkPhP+Apache+PHPstorm整合框架流程图解
2020/11/23 PHP
完美解决JS中汉字显示乱码问题(已解决)
2006/12/27 Javascript
jQuery获取样式中的背景颜色属性值/颜色值
2012/12/17 Javascript
script不刷新页面的联动前后代码
2013/09/18 Javascript
Node.js(安装,启动,测试)
2014/06/09 Javascript
javascript遍历json对象的key和任意js对象属性实例
2017/03/09 Javascript
Bootstrap实现的标签页内容切换显示效果示例
2017/05/25 Javascript
jstree单选功能的实现方法
2017/06/07 Javascript
ES6中的rest参数与扩展运算符详解
2017/07/18 Javascript
浅谈在fetch方法中添加header后遇到的预检请求问题
2017/08/31 Javascript
JavaScript实现的反序列化json字符串操作示例
2018/07/18 Javascript
解决Vue在Tomcat8下部署页面不加载的问题
2019/11/12 Javascript
微信小程序使用GoEasy实现websocket实时通讯
2020/05/19 Javascript
Vue2.0 ES6语法降级ES5的操作
2020/10/30 Javascript
Python创建二维数组实例(关于list的一个小坑)
2017/11/07 Python
如何在 Django 模板中输出 &quot;{{&quot;
2020/01/24 Python
Tensorflow训练MNIST手写数字识别模型
2020/02/13 Python
python实现滑雪者小游戏
2020/02/22 Python
世界上最大的各式箱包网络零售店:eBag
2016/07/21 全球购物
美国最大的袜子制造商和零售商:Renfro Socks
2017/09/03 全球购物
土木工程毕业生自荐信
2013/09/21 职场文书
物业保安岗位职责
2014/07/02 职场文书
四风问题查摆材料
2014/08/25 职场文书
领导干部整治奢华浪费之风思想汇报
2014/10/07 职场文书
2014年派出所工作总结
2014/11/21 职场文书
环境建议书
2015/02/04 职场文书
幼儿园门卫安全责任书
2015/05/08 职场文书
交通肇事罪辩护词
2015/05/21 职场文书
又涨知识了,自律到底多重要?
2019/06/27 职场文书
python实现简单石头剪刀布游戏
2021/10/24 Python
解决Mysql报错 Table 'mysql.user' doesn't exist
2022/05/06 MySQL