利用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中使用第三方库xlrd来写入Excel文件示例
Apr 05 Python
Python中super关键字用法实例分析
May 28 Python
python 表达式和语句及for、while循环练习实例
Jul 07 Python
python logging重复记录日志问题的解决方法
Jul 12 Python
Python读取excel指定列生成指定sql脚本的方法
Nov 28 Python
Python Pexpect库的简单使用方法
Jan 29 Python
pycharm创建一个python包方法图解
Apr 10 Python
Python3实现个位数字和十位数字对调, 其乘积不变
May 03 Python
python 读取串口数据的示例
Nov 09 Python
python工具快速为音视频自动生成字幕(使用说明)
Jan 27 Python
python SOCKET编程基础入门
Feb 27 Python
如何利用python和DOS获取wifi密码
Mar 31 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
Session保存到数据库的php类分享
2011/10/24 PHP
PHP CURL获取返回值的方法
2014/05/04 PHP
利用JQuery+EasyDrag 实现弹出可拖动的Div,同时向Div传值,然后返回Div选中的值
2009/10/24 Javascript
js 学习笔记(三)
2009/12/29 Javascript
javascript小数计算出现近似值的解决办法
2010/02/06 Javascript
使用jQuery轻松实现Ajax的实例代码
2010/08/16 Javascript
js判断是否为ie的方法小结
2014/01/13 Javascript
移动节点的jquery代码
2014/01/13 Javascript
构造函数+原型模式构造js自定义对象(最通用)
2014/05/12 Javascript
jquery 新建的元素事件绑定问题解决方案
2014/06/12 Javascript
JavaScript数组的定义及数字操作技巧
2016/06/06 Javascript
JS组件系列之使用HTML标签的data属性初始化JS组件
2016/09/14 Javascript
Angular的模块化(代码分享)
2016/12/26 Javascript
原生js实现新闻列表展开/收起全文功能
2017/01/20 Javascript
微信小程序 基础组件与导航组件详细介绍
2017/02/21 Javascript
利用jqprint插件打印页面内容的实现方法
2018/01/09 Javascript
使用Karma做vue组件单元测试的实现
2020/01/16 Javascript
[01:23]2019完美世界全国高校联赛(春季赛)合肥全国总决赛
2019/06/10 DOTA
python字典序问题实例
2014/09/26 Python
详解Python验证码识别
2016/01/25 Python
PyCharm使用教程之搭建Python开发环境
2016/06/07 Python
python生成随机图形验证码详解
2017/11/08 Python
Python 实现字符串中指定位置插入一个字符
2018/05/02 Python
Selenium定时刷新网页的实现代码
2018/10/31 Python
详解python破解zip文件密码的方法
2020/01/13 Python
Python实现对word文档添加密码去除密码的示例代码
2020/12/29 Python
Canvas制作的下雨动画的示例
2018/03/06 HTML / CSS
凯撒娱乐:Caesars Entertainment
2018/02/23 全球购物
日本化妆品植村秀俄罗斯官方网站:Shu Uemura俄罗斯
2020/02/01 全球购物
alice McCALL官网:澳大利亚时尚品牌
2020/11/16 全球购物
举例说明类变量和实例变量的区别
2016/06/30 面试题
初中三好学生事迹材料
2014/01/13 职场文书
超市创意活动方案
2014/08/15 职场文书
干部个人对照检查材料
2014/08/25 职场文书
交警作风整顿剖析材料
2014/10/11 职场文书
2015新年寄语大全
2014/12/08 职场文书