利用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用threading实现多线程详解
Feb 03 Python
Python的语言类型(详解)
Jun 24 Python
浅谈Tensorflow模型的保存与恢复加载
Apr 26 Python
python验证码识别教程之灰度处理、二值化、降噪与tesserocr识别
Jun 04 Python
Python函数参数操作详解
Aug 03 Python
Python实现分段线性插值
Dec 17 Python
python 实现UTC时间加减的方法
Dec 31 Python
详解python--模拟轮盘抽奖游戏
Apr 12 Python
python查找重复图片并删除(图片去重)
Jul 16 Python
Python调用scp向服务器上传文件示例
Dec 22 Python
django admin 根据choice字段选择的不同来显示不同的页面方式
May 13 Python
浅谈Python基础之列表那些事儿
May 11 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中的替代语法介绍
2015/01/09 PHP
微信公众号开发之通过接口删除菜单
2017/02/20 PHP
PHP pthreads v3下同步处理synchronized用法示例
2020/02/21 PHP
javascript下阻止表单重复提交、防刷新、防后退
2007/08/17 Javascript
javascript 建设银行登陆键盘
2008/06/10 Javascript
js cookies 常见网页木马挂马代码 24小时只加载一次
2009/04/13 Javascript
基于jquery的一个图片hover的插件
2010/04/24 Javascript
jQuery实现当按下回车键时绑定点击事件
2014/01/28 Javascript
jQuery 过滤方法filter()选择具有特殊属性的元素
2014/06/15 Javascript
jQuery实现table隔行换色和鼠标经过变色的两种方法
2014/06/15 Javascript
微信分享的标题、缩略图、连接及描述设置方法
2014/10/14 Javascript
《JavaScript函数式编程》读后感
2015/08/07 Javascript
Jquery为DIV添加click事件的简单实例
2016/06/02 Javascript
使用jQuery给input标签设置默认值
2016/06/20 Javascript
jQuery EasyUI Tab 选项卡问题小结
2016/08/16 Javascript
jQuery控制控件文本的长度的操作方法
2016/12/05 Javascript
详解nodejs 文本操作模块-fs模块(二)
2016/12/22 NodeJs
Vue+webpack+Element 兼容问题总结(小结)
2018/08/16 Javascript
bootstrap-table formatter 使用vue组件的方法
2019/05/09 Javascript
swiper4实现移动端导航切换
2020/10/16 Javascript
JavaScript实现秒杀时钟倒计时
2019/09/29 Javascript
React-redux实现小案例(todolist)的过程
2019/09/29 Javascript
浅谈vue在html中出现{{}}的原因及解决方式
2020/11/16 Javascript
Python使用面向对象方式创建线程实现12306售票系统
2015/12/24 Python
Python3多线程爬虫实例讲解代码
2018/01/05 Python
Python双向循环链表实现方法分析
2018/07/30 Python
python 实现字符串下标的输出功能
2020/02/13 Python
Python常用数字处理基本操作汇总
2020/09/10 Python
Python图像处理之膨胀与腐蚀的操作
2021/02/07 Python
大型车展策划方案
2014/02/01 职场文书
绘画专业自荐信
2014/07/04 职场文书
工作态度不好检讨书
2015/05/06 职场文书
安全生产奖惩制度
2015/08/06 职场文书
nginx结合openssl实现https的方法
2021/07/25 Servers
springboot 多数据源配置不生效遇到的坑及解决
2021/11/17 Java/Android
利用Apache Common将java对象池化的问题
2022/06/16 Servers