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中对元组和列表按条件进行排序的方法示例
Nov 10 Python
20招让你的Python飞起来!
Sep 27 Python
Python中matplotlib中文乱码解决办法
May 12 Python
JSONLINT:python的json数据验证库实例解析
Nov 28 Python
python调用Delphi写的Dll代码示例
Dec 05 Python
matplotlib savefig 保存图片大小的实例
May 24 Python
flask框架中勾子函数的使用详解
Aug 01 Python
对python中dict和json的区别详解
Dec 18 Python
安装PyInstaller失败问题解决
Dec 14 Python
pandas数据拼接的实现示例
Apr 16 Python
关于python3.9安装wordcloud出错的问题及解决办法
Nov 02 Python
解决pytorch 保存模型遇到的问题
Mar 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将fileterms函数返回的结果变成可读的形式
2011/04/21 PHP
php获取指定(访客)IP所有信息(地址、邮政编码、国家、经纬度等)的方法
2015/07/06 PHP
深入浅析Yii admin的权限控制
2016/08/31 PHP
Laravel路由研究之domain解决多域名问题的方法示例
2019/04/04 PHP
php如何把表单内容提交到数据库
2019/07/08 PHP
浅谈laravel-admin的sortable和orderby使用问题
2019/10/03 PHP
关于文本框的一些限制控制总结~~
2010/04/15 Javascript
js 弹出框 替代浏览器的弹出框
2010/10/29 Javascript
juqery 学习之三 选择器 子元素与表单
2010/11/25 Javascript
使用Javascript接收get传递的值的代码
2011/11/30 Javascript
关于extjs treepanel复选框选中父节点与子节点的问题
2013/04/02 Javascript
javascript:void(0)使用探讨
2013/08/27 Javascript
javascript实现简单的html5视频播放器
2015/05/06 Javascript
深入理解vuex2.0 之 modules
2017/11/20 Javascript
vue中动态添加class类名的方法
2018/09/05 Javascript
Angular4.0动画操作实例详解
2019/05/10 Javascript
微信小程序动态添加view组件的实例代码
2019/05/23 Javascript
小程序实现搜索框
2020/06/19 Javascript
[01:53]DOTA2超级联赛专访Zhou 五年职业青春成长
2013/05/29 DOTA
Python中用PIL库批量给图片加上序号的教程
2015/05/06 Python
解读Python中degrees()方法的使用
2015/05/18 Python
python中时间模块的基本使用教程
2019/05/14 Python
解决python flask中config配置管理的问题
2019/07/26 Python
Django 实现Admin自动填充当前用户的示例代码
2019/11/18 Python
使用Python爬虫库requests发送表单数据和JSON数据
2020/01/25 Python
python orm 框架中sqlalchemy用法实例详解
2020/02/02 Python
python输入中文的实例方法
2020/09/14 Python
英国奢侈品网站:MatchesFashion
2016/12/16 全球购物
区域销售经理岗位职责
2013/12/10 职场文书
精彩的演讲稿开头
2014/05/08 职场文书
分居协议书范本
2014/11/03 职场文书
清明节文明祭祀倡议书
2015/04/28 职场文书
婚礼伴郎致辞
2015/07/28 职场文书
小组组名及励志口号
2015/12/24 职场文书
小学生一年级(书信作文)
2019/08/13 职场文书
关于 Python json中load和loads区别
2021/11/07 Python