Python中用PIL库批量给图片加上序号的教程


Posted in Python onMay 06, 2015

女友让我给她论文的图片上加上字母序号,本来觉得是个很简单的事情,但那个白底黑字的圆圈序号却难住了我, 试了几个常用的软件,都不行。

后来用 PS + 动作,倒是能搞出来,不过也不容易,正好那天没搞完,于是拿回自己家做,但我的电脑上又没有 PS, 所以就用 python 实现了。

效果图

Python中用PIL库批量给图片加上序号的教程

这里用的图片全是 240X240 的,按文件名的首字母作为序号,PIL 虽然可以计算文字的尺寸,但类似 D 这样的字符依然不能处于圆圈的正中,所以还对个别字符做了偏移设置,本来想用 aggdraw 画圆圈的,能平滑 一些,不过安装了好几次,都以失败告终,最终放弃。

#!/usr/bin/env python
#-*- coding: utf-8 -*-
import os, sys, fnmatch
import Image, ImageDraw, ImageFont

def process_picture(filename):
  seq = os.path.split(filename)[-1][0].upper()
  img = Image.open(os.path.join(input_dir, filename))

  draw = ImageDraw.Draw(img)

  # 在右下角画白底黑框圆圈
  draw.ellipse((215, 215, 235, 235), outline='black', fill='white')

  # 将字母序号写入到圆圈内
  font = ImageFont.truetype('fonts/Times New Roman.ttf', 20)

  # 计算文字居中的位置
  text_size = draw.textsize(seq, font)
  x = (20 / 2) - (text_size[0] / 2)
  y = (20 / 2) - (text_size[1] / 2)

  # 字母偏移量
  offsets = {'A': 1, 'B': 1, 'E': 1, 'D': 2}
  offset = offsets.get(seq, 0)
  draw.text((215 + x + offset, 215 + y), seq, font=font, fill='black')

  # save image
  img.save(os.path.join(output_dir, filename), 'JPEG')

if __name__ == '__main__':
  if len(sys.argv) < 3:
    print 'Usage: python drawseq.py <input_dir> <output_dir>'
    sys.exit(1)

  input_dir, output_dir = sys.argv[1:3] 
  os.path.exists(output_dir) or os.makedirs(output_dir)

  for filename in os.listdir(input_dir):
    if fnmatch.fnmatch(filename.lower(), '*.jpg'):
      process_picture(filename)
Python 相关文章推荐
tensorflow创建变量以及根据名称查找变量
Mar 10 Python
Django中的Model操作表的实现
Jul 24 Python
Python设计模式之简单工厂模式实例详解
Jan 22 Python
Python函数的参数常见分类与用法实例详解
Mar 30 Python
python实现坦克大战游戏 附详细注释
Mar 27 Python
python图形用户接口实例详解
Dec 16 Python
tensorflow estimator 使用hook实现finetune方式
Jan 21 Python
postman和python mock测试过程图解
Feb 22 Python
Python openpyxl 插入折线图实例
Apr 17 Python
keras中的卷积层&amp;池化层的用法
May 22 Python
python 发送get请求接口详解
Nov 17 Python
numpy数据类型dtype转换实现
Apr 24 Python
python写入中英文字符串到文件的方法
May 06 #Python
python使用xlrd模块读写Excel文件的方法
May 06 #Python
在Python中使用全局日志时需要注意的问题
May 06 #Python
python通过post提交数据的方法
May 06 #Python
python实现逆波兰计算表达式实例详解
May 06 #Python
编写Python脚本批量下载DesktopNexus壁纸的教程
May 06 #Python
在Windows服务器下用Apache和mod_wsgi配置Python应用的教程
May 06 #Python
You might like
PHP脚本数据库功能详解(上)
2006/10/09 PHP
FirePHP 推荐一款PHP调试工具
2011/04/23 PHP
免费手机号码归属地API查询接口和PHP使用实例分享
2014/04/10 PHP
PHP中让curl支持sock5的代码实例
2015/01/21 PHP
[原创]CI(CodeIgniter)简单统计访问人数实现方法
2016/01/19 PHP
详解PHP5.6.30与Apache2.4.x配置
2017/06/02 PHP
PHP利用Socket获取网站的SSL证书与公钥
2017/06/18 PHP
Laravel5.3+框架定义API路径取消CSRF保护方法详解
2020/04/06 PHP
javascript实现阻止iOS APP中的链接打开Safari浏览器
2014/06/12 Javascript
javascript常用的方法整理
2015/08/20 Javascript
JavaScript Math 对象常用方法总结
2016/04/28 Javascript
JavaScript 实现 Tab 点击切换实例代码
2017/03/25 Javascript
Angular2监听页面大小变化的解决方法
2017/10/09 Javascript
vue中实现移动端的scroll滚动方法
2018/03/03 Javascript
详解Angular如何正确的操作DOM
2018/07/06 Javascript
对vuejs的v-for遍历、v-bind动态改变值、v-if进行判断的实例讲解
2018/08/27 Javascript
node使用request请求的方法
2019/12/20 Javascript
javascript实现京东快递单号的查询效果
2020/11/30 Javascript
[01:20:30]OG vs LGD 2018国际邀请赛淘汰赛BO3 第四场 8.26
2018/08/30 DOTA
[58:25]VP vs RNG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Django Rest framework频率原理与限制
2019/07/26 Python
python字符串的拼接方法总结
2019/11/18 Python
Pycharm的Available Packages为空的解决方法
2020/09/18 Python
日本最大的旅游网站:Rakuten Travel(乐天旅游)
2018/08/02 全球购物
娇韵诗香港官网:Clarins香港
2020/08/13 全球购物
Ado与Ado.net的相同与不同
2014/12/08 面试题
教你怎样写好自我评价
2013/10/05 职场文书
秋季运动会表扬稿
2014/01/16 职场文书
目标责任书范文
2014/04/14 职场文书
宣传部部长竞选演讲稿
2014/04/26 职场文书
关于安全演讲稿
2014/05/09 职场文书
竞赛口号大全
2014/06/16 职场文书
食品委托检验协议书范本
2014/09/12 职场文书
大学考试作弊检讨书
2015/05/06 职场文书
导游词之天下银坑景区
2019/11/21 职场文书
教你如何使用Python下载B站视频的详细教程
2021/04/29 Python