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复制文件代码实现
Dec 23 Python
python实现class对象转换成json/字典的方法
Mar 11 Python
python 实现tar文件压缩解压的实例详解
Aug 20 Python
python处理csv中的空值方法
Jun 22 Python
django之跨表查询及添加记录的示例代码
Oct 16 Python
深入解析python中的实例方法、类方法和静态方法
Mar 11 Python
Python3.5文件读与写操作经典实例详解
May 01 Python
python点击鼠标获取坐标(Graphics)
Aug 10 Python
Python学习笔记之函数的定义和作用域实例详解
Aug 13 Python
如何基于Python代码实现高精度免费OCR工具
Jun 18 Python
接口自动化多层嵌套json数据处理代码实例
Nov 20 Python
python爬虫利用代理池更换IP的方法步骤
Feb 21 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多个文件上传到服务器实例
2014/10/29 PHP
PHP+Mysql实现多关键字与多字段生成SQL语句的函数
2014/11/05 PHP
学习php设计模式 php实现访问者模式(Visitor)
2015/12/07 PHP
php获取微信openid方法总结
2019/10/10 PHP
laravel添加前台跳转成功页面示例
2019/10/22 PHP
Javascript 静态页面实现随机显示广告的办法
2010/11/17 Javascript
Javascript对象属性方法汇总
2013/11/21 Javascript
js获取客户端外网ip的简单实例
2013/11/21 Javascript
JavaScript判断用户名和密码不能为空的实现代码
2016/05/16 Javascript
JS学习之表格的排序简单实例
2016/05/16 Javascript
详解Node.js access_token的获取、存储及更新
2017/06/20 Javascript
vue2项目使用sass的示例代码
2017/06/28 Javascript
Vue cli 引入第三方JS和CSS的常用方法分享
2018/01/20 Javascript
Node.js 使用request模块下载文件的实例
2018/09/05 Javascript
小程序实现左滑删除功能
2018/10/30 Javascript
关于微信小程序登录的那些事
2019/01/08 Javascript
vue语法自动转typescript(解放双手)
2019/09/18 Javascript
Jquery Datatables的使用详解
2020/01/30 jQuery
JavaScript面向对象核心知识与概念归纳整理
2020/05/09 Javascript
[07:25]DOTA2-DPC中国联赛2月5日Recap集锦
2021/03/11 DOTA
跟老齐学Python之集合(set)
2014/09/24 Python
Python中Scrapy爬虫图片处理详解
2017/11/29 Python
利用python实现凯撒密码加解密功能
2020/03/31 Python
Python中SQLite如何使用
2020/05/27 Python
Python pytesseract验证码识别库用法解析
2020/06/29 Python
HTML5 Convas APIs方法详解
2015/04/24 HTML / CSS
阿拉伯世界最大的电子商务网站:Souq沙特阿拉伯
2016/10/28 全球购物
大家检讨书5000字
2014/02/03 职场文书
个人简历自我评价范文
2014/02/04 职场文书
社区工作感言
2014/02/21 职场文书
股东协议书范本
2014/04/14 职场文书
大学学雷锋活动总结
2014/06/26 职场文书
2014年打非治违工作总结
2014/11/13 职场文书
灵魂歌王观后感
2015/06/17 职场文书
数学复习课教学反思
2016/02/18 职场文书
教学反思怎么写
2016/02/24 职场文书