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 相关文章推荐
以911新闻为例演示Python实现数据可视化的教程
Apr 23 Python
详细介绍Python中的偏函数
Apr 27 Python
Python上传package到Pypi(代码简单)
Feb 06 Python
python计算auc指标实例
Jul 13 Python
python merge、concat合并数据集的实例讲解
Apr 12 Python
Python3实现的字典遍历操作详解
Apr 18 Python
python中的二维列表实例详解
Jun 19 Python
判断python对象是否可调用的三种方式及其区别详解
Jan 31 Python
python按修改时间顺序排列文件的实例代码
Jul 25 Python
Python实现爬取网页中动态加载的数据
Aug 17 Python
Pandas||过滤缺失数据||pd.dropna()函数的用法说明
May 14 Python
从np.random.normal()到正态分布的拟合操作
Jun 02 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 ? EasyUI DataGrid 资料取的方式介绍
2012/11/07 PHP
CI框架Session.php源码分析
2014/11/03 PHP
修改jquery.lazyload.js实现页面延迟载入
2010/12/22 Javascript
javascript父、子页面交互技巧总结
2014/08/08 Javascript
ECMAScript6中Map/WeakMap详解
2015/06/12 Javascript
详解JavaScript函数
2015/12/01 Javascript
JavaScript数据结构与算法之集合(Set)
2016/01/29 Javascript
仅30行代码实现Javascript中的MVC
2016/02/15 Javascript
js仿淘宝和百度文库的评分功能
2016/05/15 Javascript
JavaScript和jquery获取父级元素、子级元素、兄弟元素的方法
2016/06/05 Javascript
jQuery实现的小图列表,大图展示效果幻灯片示例
2016/10/25 Javascript
JS实现的简单拖拽购物车功能示例【附源码下载】
2018/01/03 Javascript
解决layui前端框架 form表单,table表等内置控件不显示的问题
2018/08/19 Javascript
Vue面试题及Vue知识点整理
2018/10/07 Javascript
js防抖和节流的深入讲解
2018/12/06 Javascript
Javascript之高级数组API的使用实例
2019/03/08 Javascript
24行JavaScript代码实现Redux的方法实例
2019/11/17 Javascript
JavaScript中数组去重的5种方法
2020/07/04 Javascript
[04:42]5分钟带你了解什么是DOTA2(第一期)
2017/02/07 DOTA
python函数参数*args**kwargs用法实例
2013/12/04 Python
在Python的Flask框架中实现单元测试的教程
2015/04/20 Python
python3使用requests模块爬取页面内容的实战演练
2017/09/25 Python
Python实现将数据写入netCDF4中的方法示例
2018/08/30 Python
Python接口自动化判断元素原理解析
2020/02/24 Python
基于pandas向csv添加新的行和列
2020/05/25 Python
给ubuntu18安装python3.7的详细教程
2020/06/08 Python
通过代码实例了解Python异常本质
2020/09/16 Python
HTML5 Canvas绘制文本及图片的基础教程
2016/03/14 HTML / CSS
财务会计专业应届毕业生求职信
2013/10/18 职场文书
百度吧主申请感言
2014/01/12 职场文书
警察先进个人事迹材料
2014/05/16 职场文书
支部组织生活会方案
2014/06/10 职场文书
春季运动会开幕词
2015/01/28 职场文书
运动会开幕式主持词
2015/07/01 职场文书
死磕 java同步系列之synchronized解析
2021/06/28 Java/Android
SQL Server中搜索特定的对象
2022/05/25 SQL Server