利用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实现线程池的方法
Jun 30 Python
浅析Python的Django框架中的Memcached
Jul 23 Python
Python的Django框架中forms表单类的使用方法详解
Jun 21 Python
Python Flask基础教程示例代码
Feb 07 Python
Python get获取页面cookie代码实例
Sep 12 Python
解决Pyinstaller 打包exe文件 取消dos窗口(黑框框)的问题
Jun 21 Python
Python实现Mysql数据统计及numpy统计函数
Jul 15 Python
Python获取一个用户名的组ID过程解析
Sep 03 Python
Python 实现一个手机号码获取妹子名字的功能
Sep 25 Python
基于pytorch padding=SAME的解决方式
Feb 18 Python
python 实现表情识别
Nov 21 Python
Python机器学习应用之基于线性判别模型的分类篇详解
Jan 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
2020年4月放送决定!第2期TV动画《邪神酱飞踢》视觉图&主题曲情报公开!
2020/03/06 日漫
Oracle Faq(Oracle的版本)
2006/10/09 PHP
批量去除PHP文件中bom的PHP代码
2012/03/13 PHP
让PHP显示Facebook的粉丝数量方法
2014/01/08 PHP
Drupal7连接多个数据库及常见问题解决
2014/03/02 PHP
Yii2.0实现生成二维码功能实例
2017/10/24 PHP
PHP实现获取毫秒时间戳的方法【使用microtime()函数】
2019/03/01 PHP
jquery 插件开发备注
2010/08/27 Javascript
Javascript实现仿WebQQ界面的“浮云”兼容 IE7以上版本及FF
2011/04/27 Javascript
JS.findElementById()使用介绍
2013/09/21 Javascript
利用javascript实现全部删或清空所选的操作
2014/05/27 Javascript
JS实现网页滚动条感应鼠标变色的方法
2015/02/26 Javascript
JavaScript 性能优化小结
2015/10/12 Javascript
jquery实现一个全局计时器(商城可用)
2017/06/30 jQuery
基于js原生和ajax的get和post方法以及jsonp的原生写法实例
2017/10/16 Javascript
一个Vue视频媒体多段裁剪组件的实现示例
2018/08/09 Javascript
对vue2.0中.vue文件页面跳转之.$router.push的用法详解
2018/08/24 Javascript
微信小程序canvas分享海报功能
2019/10/31 Javascript
微信小程序自定义支持图片的弹窗
2020/12/21 Javascript
Django中利用filter与simple_tag为前端自定义函数的实现方法
2017/06/15 Python
Python自动化运维_文件内容差异对比分析
2017/12/13 Python
pandas 转换成行列表进行读取与Nan处理的方法
2018/10/30 Python
Python实现二叉树前序、中序、后序及层次遍历示例代码
2019/05/18 Python
Python使用Opencv实现图像特征检测与匹配的方法
2019/10/30 Python
CSS3实现超酷的黑猫警长首页
2016/04/26 HTML / CSS
移动端html5模拟长按事件的实现方法
2018/09/30 HTML / CSS
自考毕业生自我鉴定
2013/11/04 职场文书
企业理念标语
2014/06/09 职场文书
团日活动总结报告
2014/06/25 职场文书
优秀共产党员演讲稿
2014/09/04 职场文书
幼儿园大班教师随笔
2015/08/14 职场文书
2016年教师师德师风心得体会
2016/01/12 职场文书
初二英语教学反思
2016/02/15 职场文书
浅谈移动端中的视口(viewport)的具体使用
2021/04/13 HTML / CSS
MySQL 重命名表的操作方法及注意事项
2021/05/21 MySQL
Window server中安装Redis的超详细教程
2021/11/17 Redis