利用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 01 Python
Python中splitlines()方法的使用简介
May 20 Python
python使用 HTMLTestRunner.py生成测试报告
Oct 20 Python
Python cookbook(字符串与文本)在字符串的开头或结尾处进行文本匹配操作
Apr 20 Python
python 实现在Excel末尾增加新行
May 02 Python
基于django channel实现websocket的聊天室的方法示例
Apr 11 Python
pandas 数据索引与选取的实现方法
Jun 21 Python
基于numpy中的expand_dims函数用法
Dec 18 Python
django 模型字段设置默认值代码
Jul 15 Python
Python实现socket库网络通信套接字
Jun 04 Python
利用python实时刷新基金估值(摸鱼小工具)
Sep 15 Python
python pandas 解析(读取、写入)CSV 文件的操作方法
Dec 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
WINDOWS下php5.2.4+mysql6.0+apache2.2.4+ZendOptimizer-3.3.0配置
2008/03/28 PHP
PHP base64+gzinflate压缩编码和解码代码
2008/10/03 PHP
PHP大批量数据操作时临时调整内存与执行时间的方法
2011/04/20 PHP
php获取mysql数据库中的所有表名的代码
2011/04/23 PHP
PHP Undefined index报错的修复方法
2011/07/17 PHP
php安全配置 如何配置使其更安全
2011/12/16 PHP
php Xdebug的安装与使用详解
2013/06/20 PHP
php中ltrim()、rtrim()与trim()删除字符空格实例
2014/11/25 PHP
PHP SPL标准库之数据结构栈(SplStack)介绍
2015/05/12 PHP
编写自己的jQuery插件简单实现代码
2011/04/19 Javascript
JS(JQuery)操作Array的相关方法介绍
2014/02/11 Javascript
JavaScript简介
2015/02/15 Javascript
Javascript中实现String.startsWith和endsWith方法
2015/06/10 Javascript
微信小程序 获取二维码实例详解
2017/06/23 Javascript
jQuery实现简单的计时器功能实例分析
2017/08/29 jQuery
Vue添加请求拦截器及vue-resource 拦截器使用
2017/11/23 Javascript
移动端吸顶fixbar的解决方案详解
2019/07/17 Javascript
angular8和ngrx8结合使用的步骤介绍
2019/12/01 Javascript
[01:44]剑指西雅图 展望TI之CIS战队专访
2014/06/25 DOTA
[43:03]LGD vs Newbee 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
py2exe 编译ico图标的代码
2013/03/08 Python
Python set常用操作函数集锦
2017/11/15 Python
Python爬取新型冠状病毒“谣言”新闻进行数据分析
2020/02/16 Python
Python Tornado之跨域请求与Options请求方式
2020/03/28 Python
Python批量修改xml的坐标值全部转为整数的实例代码
2020/11/26 Python
谷歌浏览器小字体处理方案即12px以下字体
2013/12/17 HTML / CSS
HTML5实现动画效果的方式汇总
2016/02/29 HTML / CSS
捷克钓鱼用品网上商店:Parys.cz
2018/06/15 全球购物
Big Green Smile法国:领先的英国有机和天然产品在线商店
2021/01/02 全球购物
求职简历中个人的自我评价
2013/12/01 职场文书
“学雷锋活动月”总结
2014/03/09 职场文书
化工专业自荐书
2014/06/16 职场文书
课外访万家心得体会
2014/09/03 职场文书
个人创业事迹材料
2014/12/30 职场文书
又涨知识了,自律到底多重要?
2019/06/27 职场文书
《成长的天空》读后感3篇
2019/12/06 职场文书