利用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中的偏函数
Apr 27 Python
Python通过90行代码搭建一个音乐搜索工具
Jul 29 Python
Python利用Beautiful Soup模块创建对象详解
Mar 27 Python
利用python实现xml与数据库读取转换的方法
Jun 17 Python
django自带的server 让外网主机访问方法
May 14 Python
Python基于多线程实现ping扫描功能示例
Jul 23 Python
TensorFlow利用saver保存和提取参数的实例
Jul 26 Python
浅析python,PyCharm,Anaconda三者之间的关系
Nov 27 Python
python之pymysql模块简单应用示例代码
Dec 16 Python
使用python-pptx包批量修改ppt格式的实现
Feb 14 Python
python简单的三元一次方程求解实例
Apr 02 Python
Pandas将列表(List)转换为数据框(Dataframe)
Apr 24 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/03/16 PHP
根据key删除数组中指定的元素实现方法
2017/03/02 PHP
PHP PDOStatement::errorInfo讲解
2019/01/31 PHP
jquery插件制作 手风琴Panel效果实现
2012/08/17 Javascript
jQuery div层的放大与缩小简单实现代码
2013/03/28 Javascript
JavaScript中的运算符种类及其规则介绍
2013/09/26 Javascript
在JS数组特定索引处指定位置插入元素的技巧
2014/08/24 Javascript
JavaScript字符串对象slice方法入门实例(用于字符串截取)
2014/10/16 Javascript
JQuery中使用.each()遍历元素学习笔记
2014/11/08 Javascript
Ajax清除浏览器js、css、图片缓存的方法
2015/08/06 Javascript
基于javascript实现浏览器滚动条快到底部时自动加载数据
2015/11/30 Javascript
Angular表单验证实例详解
2016/10/20 Javascript
Node.js中多进程模块Cluster的介绍与使用
2017/05/27 Javascript
详解Vue.use自定义自己的全局组件
2017/06/14 Javascript
vue组件传递对象中实现单向绑定的示例
2018/02/28 Javascript
React 使用browserHistory项目访问404问题解决
2018/06/01 Javascript
vue左侧菜单,树形图递归实现代码
2018/08/24 Javascript
浅谈redux以及react-redux简单实现
2018/08/28 Javascript
python 添加用户设置密码并发邮件给root用户
2016/07/25 Python
Python整型运算之布尔型、标准整型、长整型操作示例
2017/07/21 Python
python中logging库的使用总结
2017/10/18 Python
Python搜索引擎实现原理和方法
2017/11/27 Python
python使用adbapi实现MySQL数据库的异步存储
2019/03/19 Python
wxPython+Matplotlib绘制折线图表
2019/11/19 Python
python实现的分析并统计nginx日志数据功能示例
2019/12/21 Python
css3实现针线缝合效果(图解步骤)
2013/02/04 HTML / CSS
用HTML5制作烟火效果的教程
2015/05/12 HTML / CSS
自我鉴定书面格式
2014/01/13 职场文书
会计辞职信范文
2014/01/15 职场文书
简历里的自我评价范文
2014/02/24 职场文书
户外活动策划方案
2014/03/12 职场文书
护士长2014年终工作总结
2014/11/11 职场文书
入党积极分子党支部意见
2015/06/02 职场文书
六年级作文之预言作文
2019/10/25 职场文书
Python爬取某拍短视频
2021/06/11 Python
TV动画《八十龟酱观察日记》第四季宣传PV公布
2022/04/06 日漫