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 30 Python
Python中urllib2模块的8个使用细节分享
Jan 01 Python
Python 字典与字符串的互转实例
Jan 13 Python
Python虚拟环境项目实例
Nov 20 Python
Python实现矩阵转置的方法分析
Nov 24 Python
Python实现基本数据结构中队列的操作方法示例
Dec 04 Python
使用python进行文本预处理和提取特征的实例
Jun 05 Python
Python解决走迷宫问题算法示例
Jul 27 Python
基于MATLAB和Python实现MFCC特征参数提取
Aug 13 Python
Pandas时间序列:重采样及频率转换方式
Dec 26 Python
Python多线程threading创建及使用方法解析
Jun 17 Python
Python Matplotlib绘制条形图的全过程
Oct 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 远程文件管理,可以给表格排序,遍历目录,时间排序
2009/08/07 PHP
Yii2框架dropDownList下拉菜单用法实例分析
2016/07/18 PHP
Laravel中间件实现原理详解
2016/10/09 PHP
PHP数据库处理封装类实例
2016/12/24 PHP
PHP数据库操作三:redis用法分析
2017/08/16 PHP
laravel withCount 统计关联数量的方法
2019/10/10 PHP
js过滤HTML标签以及空格的思路及代码
2013/05/24 Javascript
JS动态给对象添加事件的简单方法
2016/07/19 Javascript
浅谈vue+webpack项目调试方法步骤
2017/09/11 Javascript
angular2模块和共享模块详解
2018/04/08 Javascript
使用Angular Cli如何创建Angular私有库详解
2019/01/30 Javascript
基于ssm框架实现layui分页效果
2019/07/27 Javascript
基于redis的小程序登录实现方法流程分析
2020/05/25 Javascript
JS将指定的某个字符全部转换为其他字符实例代码
2020/10/13 Javascript
微信小程序实现可长按移动控件
2020/11/01 Javascript
[01:15:36]加油刀塔第二期网络版
2014/08/09 DOTA
Python中Random和Math模块学习笔记
2015/05/18 Python
Python错误提示:[Errno 24] Too many open files的分析与解决
2017/02/16 Python
python中类变量与成员变量的使用注意点总结
2017/04/29 Python
Python使用pylab库实现画线功能的方法详解
2017/06/08 Python
python模块smtplib学习
2018/05/22 Python
Python 2/3下处理cjk编码的zip文件的方法
2019/04/26 Python
PyQt4 treewidget 选择改变颜色,并设置可编辑的方法
2019/06/17 Python
详解python tkinter 图片插入问题
2020/09/03 Python
基于Django快速集成Echarts代码示例
2020/12/01 Python
python实现ping命令小程序
2020/12/28 Python
基于css3的属性transition制作菜单导航效果
2015/09/01 HTML / CSS
美国知名女性服饰品牌:New York & Company
2017/03/23 全球购物
size?爱尔兰官方网站:英国伦敦的球鞋精品店
2019/03/31 全球购物
Wiggle澳大利亚:自行车、跑步、游泳商店
2020/11/07 全球购物
设置器与访问器的定义以及各自特点
2016/01/08 面试题
11.9消防日宣传标语
2014/10/08 职场文书
小学生作文之《压岁钱的烦恼》
2019/09/27 职场文书
Python机器学习之KNN近邻算法
2021/05/14 Python
解决Mysql多行子查询的使用及空值问题
2022/01/22 MySQL
Vue.js中v-for指令的用法介绍
2022/03/13 Vue.js