利用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 相关文章推荐
windows下安装python paramiko模块的代码
Feb 10 Python
python中getattr函数使用方法 getattr实现工厂模式
Jan 20 Python
python 队列详解及实例代码
Oct 18 Python
python笔记:mysql、redis操作方法
Jun 28 Python
Pandas:DataFrame对象的基础操作方法
Jun 07 Python
django利用request id便于定位及给日志加上request_id
Aug 26 Python
pycharm 配置远程解释器的方法
Oct 28 Python
python3实现多线程聊天室
Dec 12 Python
Django框架中间件(Middleware)用法实例分析
May 24 Python
Python脚本实现监听服务器的思路代码详解
May 28 Python
keras多显卡训练方式
Jun 10 Python
Python从文件中读取数据的方法步骤
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
PHP怎样调用MSSQL的存储过程
2006/10/09 PHP
php xfocus防注入资料
2008/04/27 PHP
php实现把数组按指定的个数分隔
2014/02/17 PHP
PHP中session变量的销毁
2014/02/27 PHP
php实现按照权重随机排序数据的方法
2015/01/09 PHP
Yii框架组件和事件行为管理详解
2016/05/20 PHP
php学习笔记之mb_strstr的基本使用
2018/02/03 PHP
thinkphp3.2框架中where条件查询用法总结
2019/08/13 PHP
jQuery数据缓存用法分析
2015/02/20 Javascript
JS实现选中当前菜单后高亮显示的导航条效果
2015/10/15 Javascript
微信小程序开发之入门实例教程篇
2017/03/07 Javascript
微信小程序 页面跳转如何实现传值
2017/04/05 Javascript
巧用weui.topTips验证数据的实例
2017/04/17 Javascript
详解基于node的前端项目编译时内存溢出问题
2017/08/01 Javascript
Vue中render方法的使用详解
2018/01/26 Javascript
Nodejs 识别图片类型的方法
2019/08/15 NodeJs
JS实现基本的网页计算器功能示例
2020/01/16 Javascript
Vue 技巧之控制父类的 slot
2020/02/24 Javascript
[02:11]2016国际邀请赛中国区预选赛最美TA采访现场玩家
2016/06/28 DOTA
关于python写入文件自动换行的问题
2018/06/23 Python
Python批处理更改文件名os.rename的方法
2018/10/26 Python
如何在Django中设置定时任务的方法示例
2019/01/18 Python
实例讲解Python3中abs()函数
2019/02/19 Python
python使用socket实现的传输demo示例【基于TCP协议】
2019/09/24 Python
Python 没有main函数的原因
2020/07/10 Python
使用 HTML5 Canvas 制作水波纹效果点击图片就会触发
2014/09/15 HTML / CSS
HTML5 Canvas 绘图——使用 Canvas 绘制图形图文教程 使用html5 canvas 绘制精美的图
2015/08/31 HTML / CSS
Dillard’s百货官网:Dillards.com
2018/05/26 全球购物
Wilson体育用品官网:美国著名运动器材品牌
2019/05/12 全球购物
教师岗位职责
2013/11/17 职场文书
12岁生日演讲稿
2014/05/14 职场文书
毕业实习指导教师评语
2014/12/31 职场文书
教师年度个人总结
2015/02/11 职场文书
索赔员岗位职责
2015/02/15 职场文书
德能勤绩工作总结
2015/08/11 职场文书
如何将numpy二维数组中的np.nan值替换为指定的值
2021/05/14 Python