利用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将一个Excel拆分为多个Excel
Nov 07 Python
python 实现得到当前时间偏移day天后的日期方法
Dec 31 Python
Python设计模式之抽象工厂模式原理与用法详解
Jan 15 Python
Python文件打开方式实例详解【a、a+、r+、w+区别】
Mar 30 Python
OpenCV3.0+Python3.6实现特定颜色的物体追踪
Jul 23 Python
在pandas中遍历DataFrame行的实现方法
Oct 23 Python
opencv之为图像添加边界的方法示例
Dec 26 Python
python图形开发GUI库wxpython使用方法详解
Feb 14 Python
Python列表去重复项的N种方法(实例代码)
May 12 Python
基于Python快速处理PDF表格数据
Jun 03 Python
python实现数学模型(插值、拟合和微分方程)
Nov 13 Python
python某漫画app逆向
Mar 31 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/02 无线电
SSO单点登录的PHP实现方法(Laravel框架)
2016/03/23 PHP
ThinkPHP路由机制简介
2016/03/23 PHP
Yii遍历行下每列数据的方法
2016/10/17 PHP
php及codeigniter使用session-cookie的方法(详解)
2017/04/06 PHP
PHP code 验证码生成类定义和简单使用示例
2020/05/27 PHP
document 和 document.all 分别什么时候用
2006/06/22 Javascript
Javascript 获取链接(url)参数的方法
2009/02/15 Javascript
javascript中的onkeyup和onkeydown区别介绍
2013/04/28 Javascript
js重写alert控件(适合学习js的新手朋友)
2014/08/24 Javascript
js实现按Ctrl+Enter发送效果
2014/09/18 Javascript
详解JavaScript基于面向对象之继承实例
2015/12/16 Javascript
ajax在兼容模式下失效的快速解决方法
2016/03/22 Javascript
javascript构造函数以及原型对象的理解
2017/01/13 Javascript
从零开始学习Node.js系列教程三:图片上传和显示方法示例
2017/04/13 Javascript
vue实现密码显示隐藏切换功能
2018/02/23 Javascript
微信小程序sessionid不一致问题解决
2019/08/30 Javascript
Vue实现验证码功能
2019/12/03 Javascript
[03:31]DOTA2英雄基础教程 大地之灵
2013/12/17 DOTA
详解重置Django migration的常见方式
2019/02/15 Python
Python3安装psycopy2以及遇到问题解决方法
2019/07/03 Python
通过实例简单了解Python中yield的作用
2019/12/11 Python
在pytorch 中计算精度、回归率、F1 score等指标的实例
2020/01/18 Python
解决keras backend 越跑越慢问题
2020/06/18 Python
Sneaker Studio捷克:购买运动鞋
2018/07/08 全球购物
爱国卫生月实施方案
2014/02/21 职场文书
公司合作协议书范本
2014/04/18 职场文书
新农村建设典型材料
2014/05/31 职场文书
焦裕禄精神心得体会
2014/09/02 职场文书
个人贷款授权委托书样本
2014/10/07 职场文书
小学语文国培研修日志
2015/11/13 职场文书
职场中的你,辞职信写对了吗?
2019/06/26 职场文书
导游词之西安骊山
2019/12/03 职场文书
探讨Java中的深浅拷贝问题
2021/06/26 Java/Android
Golang 结构体数据集合
2022/04/22 Golang
MySQL导致索引失效的几种情况
2022/06/25 MySQL