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实现的tab文件操作类分享
Nov 20 Python
python实现挑选出来100以内的质数
Mar 24 Python
python使用urlparse分析网址中域名的方法
Apr 15 Python
python 随机数使用方法,推导以及字符串,双色球小程序实例
Sep 12 Python
Python 模拟员工信息数据库操作的实例
Oct 23 Python
通过Python 获取Android设备信息的轻量级框架
Dec 18 Python
Flask框架URL管理操作示例【基于@app.route】
Jul 23 Python
Python实现繁体中文与简体中文相互转换的方法示例
Dec 18 Python
Python2.7实现多进程下开发多线程示例
May 31 Python
Python列表操作方法详解
Feb 09 Python
解决python 执行sql语句时所传参数含有单引号的问题
Jun 06 Python
python内置模块之上下文管理contextlib
Jun 14 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中ADODB类详解
2008/03/25 PHP
完美解决thinkphp唯一索引重复时出错的问题
2017/03/31 PHP
gearman管理工具GearmanManager的安装与php使用方法示例
2020/02/27 PHP
Thinkphp5框架异常处理操作实例分析
2020/06/03 PHP
Sample script that displays all of the users in a given SQL Server DB
2007/06/16 Javascript
jQuery入门问答 整理的几个常见的初学者问题
2010/02/22 Javascript
菜鸟学习JavaScript小实验之函数引用
2010/11/17 Javascript
jquery实现图片裁剪思路及实现
2013/08/16 Javascript
使用jQuery重置(reset)表单的方法
2014/05/05 Javascript
window.open()详解及浏览器兼容性问题示例探讨
2014/05/29 Javascript
创建、调用JavaScript对象的方法集锦
2014/12/24 Javascript
jquery用ajax方式从后台获取json数据后如何将内容填充到下拉列表
2015/08/26 Javascript
详解javascript中原始数据类型Null和Undefined
2015/12/17 Javascript
javascript使用btoa和atob来进行Base64转码和解码
2017/03/20 Javascript
vue2.0实现倒计时的插件(时间戳 刷新 跳转 都不影响)
2017/03/30 Javascript
深入理解React Native原生模块与JS模块通信的几种方式
2017/07/24 Javascript
收集前端面试题之url、href、src
2018/03/22 Javascript
angular 用Observable实现异步调用的方法
2018/12/27 Javascript
Angular CLI 使用教程指南参考小结
2019/04/10 Javascript
node中IO以及定时器优先级详解
2019/05/10 Javascript
[35:34]Liquid vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python多线程编程(五):死锁的形成
2015/04/05 Python
Django 如何获取前端发送的头文件详解(推荐)
2017/08/15 Python
浅谈python中的正则表达式(re模块)
2017/10/17 Python
基于Python实现的微信好友数据分析
2018/02/26 Python
Python sorted函数详解(高级篇)
2018/09/18 Python
Python实现注册、登录小程序功能
2018/09/21 Python
对python中字典keys,values,items的使用详解
2019/02/03 Python
python中将两组数据放在一起按照某一固定顺序shuffle的实例
2019/07/15 Python
python实现按关键字筛选日志文件
2019/12/24 Python
Clarks西班牙官方在线商店:clarks鞋
2019/05/03 全球购物
中职应届生会计求职信
2013/10/23 职场文书
党员倡议书
2015/01/19 职场文书
北京英语导游词
2015/02/12 职场文书
MySQL系列之三 基础篇
2021/07/02 MySQL
idea编译器vue缩进报错问题场景分析
2021/07/04 Vue.js