利用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 流程控制实例代码
Sep 25 Python
跟老齐学Python之做一个小游戏
Sep 28 Python
Python中的特殊语法:filter、map、reduce、lambda介绍
Apr 14 Python
python对列进行平移变换的方法(shift)
Jan 10 Python
深入浅析python3中的unicode和bytes问题
Jul 03 Python
tensor和numpy的互相转换的实现示例
Aug 02 Python
Python调用.net动态库实现过程解析
Jun 05 Python
使用python将微信image下.dat文件解密为.png的方法
Nov 30 Python
filter使用python3代码进行迭代元素的实例详解
Dec 03 Python
通过python-pptx模块操作ppt文件的方法
Dec 26 Python
Python实现曲线拟合的最小二乘法
Feb 19 Python
Python图片处理之图片裁剪教程
May 27 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
什么是短波收听SWL
2021/03/01 无线电
php字符串比较函数用法小结(strcmp,strcasecmp,strnatcmp及strnatcasecmp)
2016/07/18 PHP
Yii 框架使用Forms操作详解
2020/05/18 PHP
jQuery EasyUI API 中文文档 - ProgressBar 进度条
2011/09/29 Javascript
jquery实现奇偶行赋值不同css值
2012/02/17 Javascript
javascript发送短信验证码实现代码
2015/11/12 Javascript
JavaScript的ExtJS框架中表格的编写教程
2016/05/21 Javascript
JavaScript给每一个li节点绑定点击事件的实现方法
2016/12/01 Javascript
Angular-Touch库用法示例
2016/12/22 Javascript
JavaScript中 DOM操作方法小结
2017/04/25 Javascript
JavaScript门面模式详解
2017/10/19 Javascript
关于axios不能使用Vue.use()浅析
2018/01/12 Javascript
vue-cli开发时,关于ajax跨域的解决方法(推荐)
2018/02/03 Javascript
ES6使用export和import实现模块化的方法
2018/09/10 Javascript
小程序实现人脸识别功能(百度ai)
2018/12/23 Javascript
Vue实现固定定位图标滑动隐藏效果
2019/05/30 Javascript
Js和VUE实现跑马灯效果
2020/05/25 Javascript
Vue $emit()不能触发父组件方法的原因及解决
2020/07/28 Javascript
[04:11]DOTA2上海特级锦标赛主赛事首日TOP10
2016/03/03 DOTA
教你如何在Django 1.6中正确使用 Signal
2014/06/22 Python
python中元类用法实例
2014/10/10 Python
Python性能优化技巧
2015/03/09 Python
Python中强大的命令行库click入门教程
2016/12/26 Python
python使用tornado实现简单爬虫
2018/07/28 Python
使用python的pandas库读取csv文件保存至mysql数据库
2018/08/20 Python
Python线程池模块ThreadPoolExecutor用法分析
2018/12/28 Python
Python判断三段线能否构成三角形的代码
2020/04/12 Python
详解如何用canvas画一个微笑的表情
2019/03/14 HTML / CSS
吸烟检讨书2000字
2014/02/13 职场文书
科研课题实施方案
2014/03/18 职场文书
活动总结怎么写
2014/04/28 职场文书
运输企业安全生产责任书
2014/07/28 职场文书
2014优秀党员事迹材料
2014/08/14 职场文书
python 下载文件的几种方式分享
2021/04/07 Python
springboot集成springCloud中gateway时启动报错的解决
2021/07/16 Java/Android
美国运营商 T-Mobile 以 117.83Mb/s 的速度排第一位
2022/04/21 数码科技