利用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 15 Python
一个基于flask的web应用诞生 组织结构调整(7)
Apr 11 Python
Python正则表达式经典入门教程
May 22 Python
Python实现的井字棋(Tic Tac Toe)游戏示例
Jan 31 Python
python2.7和NLTK安装详细教程
Sep 19 Python
python可视化实现代码
Jan 15 Python
python中metaclass原理与用法详解
Jun 25 Python
Laravel框架表单验证格式化输出的方法
Sep 25 Python
linux 下python多线程递归复制文件夹及文件夹中的文件
Jan 02 Python
python传到前端的数据,双引号被转义的问题
Apr 03 Python
Python Excel vlookup函数实现过程解析
Jun 22 Python
Django正则URL匹配实现流程解析
Nov 13 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
中东人咖啡哲学
2021/03/03 咖啡文化
php+mysql写的简单留言本实例代码
2008/07/25 PHP
php的hash算法介绍
2014/02/13 PHP
高性能PHP框架Symfony2经典入门教程
2014/07/08 PHP
PHP启动windows应用程序、执行bat批处理、执行cmd命令的方法(exec、system函数详解)
2014/10/20 PHP
浅谈json_encode用法
2015/03/05 PHP
Thinkphp单字母函数使用指南
2016/05/08 PHP
php实现图片以base64显示的方法
2016/10/13 PHP
PHP实现微信图片上传到服务器的方法示例
2017/06/29 PHP
ThinkPHP实现转换数据库查询结果数据到对应类型的方法
2017/11/16 PHP
js 省地市级联选择
2010/02/07 Javascript
js动态在form上插入enctype=multipart/form-data的问题
2012/05/24 Javascript
使用jquery组件qrcode生成二维码及应用指南
2015/02/22 Javascript
javascript实现倒计时跳转页面
2016/01/17 Javascript
javascript jquery对form元素的常见操作详解
2016/06/12 Javascript
Javascript中的数组常用方法解析
2016/06/17 Javascript
javascript insertAfter()定义与用法示例
2016/07/25 Javascript
第一次接触神奇的Bootstrap表单
2016/07/27 Javascript
JavaScript学习笔记之惰性函数示例详解
2017/08/27 Javascript
vue中实现先请求数据再渲染dom分享
2018/03/17 Javascript
浅谈Vue数据响应思路之数组
2018/11/06 Javascript
详解如何在vscode里面调试js和node.js的方法步骤
2018/12/24 Javascript
React-redux实现小案例(todolist)的过程
2019/09/29 Javascript
对比Python中__getattr__和 __getattribute__获取属性的用法
2016/06/21 Python
Scrapy框架使用的基本知识
2018/10/21 Python
python代码实现将列表中重复元素之间的内容全部滤除
2020/05/22 Python
python变量的作用域是什么
2020/05/26 Python
安装pyinstaller遇到的各种问题(小结)
2020/11/20 Python
一个基于canvas的移动端图片编辑器的实现
2020/10/28 HTML / CSS
澳洲国民品牌乡村路折扣店:Country Road & Trenery Outlet
2018/04/19 全球购物
List、Map、Set三个接口,存取元素时,各有什么特点?
2015/09/27 面试题
金属材料工程毕业生个人的自我评价
2013/11/28 职场文书
岗位廉洁从业承诺书
2014/03/28 职场文书
2014年教师政治学习材料
2014/06/02 职场文书
教师“一帮一”结对子活动总结
2015/05/07 职场文书
MySQ InnoDB和MyISAM存储引擎介绍
2022/04/26 MySQL