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中处理unchecked未捕获异常实例
Jan 17 Python
python统计cpu利用率的方法
Jun 02 Python
python清理子进程机制剖析
Nov 23 Python
Python中的探索性数据分析(功能式)
Dec 22 Python
Python基本数据结构与用法详解【列表、元组、集合、字典】
Mar 23 Python
Python使用Slider组件实现调整曲线参数功能示例
Sep 06 Python
Python常用数据类型之间的转换总结
Sep 06 Python
Python tensorflow实现mnist手写数字识别示例【非卷积与卷积实现】
Dec 19 Python
keras 权重保存和权重载入方式
May 21 Python
python如何实现读取并显示图片(不需要图形界面)
Jul 08 Python
python的数学算法函数及公式用法
Nov 18 Python
Python实现淘宝秒杀功能的示例代码
Jan 19 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 goto语句简介和使用实例
2014/03/11 PHP
AES加解密在php接口请求过程中的应用示例
2016/10/26 PHP
jQuery 位置插件
2008/12/25 Javascript
node.js不得不说的12点内容
2014/07/14 Javascript
jQuery异步获取json数据方法汇总
2014/12/22 Javascript
js实现带圆角的多级下拉菜单效果
2015/08/28 Javascript
jQuery基于扩展简单实现倒计时功能的方法
2016/05/14 Javascript
遍历js中对象的属性和值的实例
2016/11/21 Javascript
概述jQuery的元素筛选
2016/11/23 Javascript
基于Node.js + WebSocket打造即时聊天程序嗨聊
2016/11/29 Javascript
在 Angular2 中实现自定义校验指令(确认密码)的方法
2017/01/23 Javascript
ThinkPHP+jquery实现“加载更多”功能代码
2017/03/11 Javascript
HTML5+jQuery实现搜索智能匹配功能
2017/03/24 jQuery
JavaScript实现全选取消效果
2017/12/14 Javascript
vuex操作state对象的实例代码
2018/04/25 Javascript
Nodejs + sequelize 实现增删改查操作
2020/11/07 NodeJs
[01:13]DOTA2群星解读国服召集令 一起说出回归的理由
2013/07/17 DOTA
[46:12]完美世界DOTA2联赛循环赛 DM vs Matador BO2第一场 11.04
2020/11/04 DOTA
Python实现控制台中的进度条功能代码
2017/12/22 Python
Python Grid使用和布局详解
2018/06/30 Python
Linux下python3.7.0安装教程
2018/07/30 Python
python在回调函数中获取返回值的方法
2019/02/22 Python
python实现秒杀商品的微信自动提醒功能(代码详解)
2020/04/27 Python
解决TensorFlow程序无限制占用GPU的方法
2020/06/30 Python
python如何变换环境
2020/07/21 Python
scrapy与selenium结合爬取数据(爬取动态网站)的示例代码
2020/09/28 Python
全球高级音频和视频专家:HiDef Lifestyle
2019/08/02 全球购物
写一个在SQL Server创建表的SQL语句
2012/03/10 面试题
英语简历自我评价
2014/01/26 职场文书
致标枪运动员加油稿
2014/02/15 职场文书
自强之星事迹材料
2014/05/12 职场文书
初中学习计划书范文
2014/09/15 职场文书
2019年销售部季度工作计划3篇
2019/10/09 职场文书
十大最帅动漫男主 碓冰拓海上榜,第一是《灌篮高手》男主角
2022/03/18 日漫
Redis分布式锁的7种实现
2022/04/01 Redis
TypeScript 内置高级类型编程示例
2022/09/23 Javascript