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基于Tkinter的HelloWorld入门实例
Jun 17 Python
Python的MongoDB模块PyMongo操作方法集锦
Jan 05 Python
详解Python函数可变参数定义及其参数传递方式
Aug 02 Python
numpy.random.seed()的使用实例解析
Feb 03 Python
python+opencv识别图片中的圆形
Mar 25 Python
使用numba对Python运算加速的方法
Oct 15 Python
python找出完数的方法
Nov 12 Python
介绍一款python类型检查工具pyright(推荐)
Jul 03 Python
Django中Middleware中的函数详解
Jul 18 Python
Python实现自定义读写分离代码实例
Nov 16 Python
python线程优先级队列知识点总结
Feb 28 Python
Python 的演示平台支持 WSGI 接口的应用
Apr 20 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
Amazon Prime Video平台《无限住人 -IMMORTAL-》2020年开始TV放送!
2020/03/06 日漫
ThinkPHP表单令牌错误的相关解决方法分析
2016/05/20 PHP
php输出图像的方法实例分析
2017/02/16 PHP
PHP7引入的&quot;??&quot;和&quot;?:&quot;的区别讲解
2019/04/08 PHP
js验证表单第二部分
2006/11/25 Javascript
js实现的仿新浪微博完美的时间组件升级版
2011/12/20 Javascript
ASP.NET jQuery 实例14 在ASP.NET form中校验时间范围
2012/02/03 Javascript
js 固定悬浮效果实现思路代码
2013/08/02 Javascript
jQuery经过一段时间自动隐藏指定元素的方法
2015/03/17 Javascript
jQuery插件EnPlaceholder实现输入框提示文字
2015/06/05 Javascript
Javascript实现倒计时(防页面刷新)实例
2016/12/13 Javascript
详解jQuery中基本的动画方法
2016/12/14 Javascript
Vue组件开发初探
2017/02/14 Javascript
json2.js 入门教程之使用方法与实例分析
2017/09/14 Javascript
在vue2.0中引用element-ui组件库的方法
2018/06/21 Javascript
详解基于DllPlugin和DllReferencePlugin的webpack构建优化
2018/06/28 Javascript
Vue press 支持图片放大功能的实例代码
2018/11/09 Javascript
Vue函数式组件的应用实例详解
2019/08/30 Javascript
小程序调用微信支付的方法
2019/09/26 Javascript
《javascript设计模式》学习笔记三:Javascript面向对象程序设计单例模式原理与实现方法分析
2020/04/07 Javascript
[07:47]DOTA2国际邀请赛采访专栏:探访Valve总部
2013/08/08 DOTA
下载给定网页上图片的方法
2014/02/18 Python
Python使用bs4获取58同城城市分类的方法
2015/07/08 Python
python 添加用户设置密码并发邮件给root用户
2016/07/25 Python
利用Python将时间或时间间隔转为ISO 8601格式方法示例
2017/09/05 Python
python使用生成器实现可迭代对象
2018/03/20 Python
pandas 数据实现行间计算的方法
2018/06/08 Python
python统计文章中单词出现次数实例
2020/02/27 Python
Python中zipfile压缩文件模块的基本使用教程
2020/06/14 Python
用HTML5实现鼠标滚轮事件放大缩小图片的功能
2015/06/25 HTML / CSS
六十大寿答谢词
2014/01/12 职场文书
北京申奥口号
2014/06/19 职场文书
2014村党支部书记党建工作汇报材料
2014/11/02 职场文书
先进事迹材料怎么写
2014/12/30 职场文书
财务部岗位职责范本
2015/04/14 职场文书
2016年元旦致辞
2015/08/01 职场文书