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 相关文章推荐
Python实现计算最小编辑距离
Mar 17 Python
Python 序列的方法总结
Oct 18 Python
Python实现的远程登录windows系统功能示例
Jun 21 Python
用Python编写一个高效的端口扫描器的方法
Dec 20 Python
Python提取频域特征知识点浅析
Mar 04 Python
Python API 自动化实战详解(纯代码)
Jun 11 Python
在PyCharm中控制台输出日志分层级分颜色显示的方法
Jul 11 Python
Anaconda之conda常用命令介绍(安装、更新、删除)
Oct 06 Python
python 实现矩阵按对角线打印
Nov 29 Python
python定义类self用法实例解析
Jan 22 Python
记一次django内存异常排查及解决方法
Aug 07 Python
django中cookiecutter的使用教程
Dec 03 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 5.0对象模型深度探索之属性和方法
2008/03/27 PHP
php实现html标签闭合检测与修复方法
2015/07/09 PHP
PHP在linux上执行外部命令的方法
2017/02/06 PHP
thinkPHP显示不出验证码的原因与解决方法分析
2017/05/20 PHP
PHP抽象类与接口的区别实例详解
2019/05/09 PHP
PHP如何使用array_unshift()在数组开头插入元素
2020/09/01 PHP
JavaScript操作Oracle数据库示例
2015/03/06 Javascript
jquery滚动特效集锦
2015/06/03 Javascript
详解AngularJS中自定义指令的使用
2015/06/17 Javascript
TypeOf这些知识点你了解吗
2016/02/21 Javascript
javascript设计模式之Adapter模式【适配器模式】实现方法示例
2017/01/13 Javascript
js数组与字符串常用方法总结
2017/01/13 Javascript
vue组件如何被其他项目引用
2017/04/13 Javascript
Vue动态实现评分效果
2017/05/24 Javascript
vue做移动端适配最佳解决方案(亲测有效)
2018/09/04 Javascript
element-ui的回调函数Events的用法详解
2018/10/16 Javascript
jQuery三组基本动画与自定义动画操作实例总结
2020/05/09 jQuery
[51:15]2014 DOTA2国际邀请赛中国区预选赛 Orenda VS LGD-GAMING
2014/05/22 DOTA
python 获取et和excel的版本号
2009/04/09 Python
Python如何读取MySQL数据库表数据
2017/03/11 Python
Python 实现「食行生鲜」签到领积分功能
2018/09/26 Python
python内置函数sorted()用法深入分析
2019/10/08 Python
Python matplotlib以日期为x轴作图代码实例
2019/11/22 Python
python 实现全球IP归属地查询工具
2020/12/18 Python
Python利用socket模块开发简单的端口扫描工具的实现
2021/01/27 Python
美国运动鞋类和服装零售连锁店:Shoe Palace
2019/08/13 全球购物
毕业自我评价范文
2013/11/17 职场文书
会展策划与管理专业大学生职业生涯规划
2014/02/07 职场文书
销售个人求职信范文
2014/04/28 职场文书
就业协议书样本
2014/08/20 职场文书
医院领导班子查摆问题对照检查材料思想汇报
2014/10/08 职场文书
鲁滨孙漂流记读书笔记
2015/06/30 职场文书
证婚人婚礼致辞
2015/07/28 职场文书
python实现批量提取指定文件夹下同类型文件
2021/04/05 Python
Python Pandas模块实现数据的统计分析的方法
2021/06/24 Python
html解决浏览器记住密码输入框的问题
2023/05/07 HTML / CSS