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学习资料
Feb 08 Python
用Python实现一个简单的能够发送带附件的邮件程序的教程
Apr 08 Python
Django REST为文件属性输出完整URL的方法
Dec 18 Python
hmac模块生成加入了密钥的消息摘要详解
Jan 11 Python
Python3 jupyter notebook 服务器搭建过程
Nov 30 Python
将string类型的数据类型转换为spark rdd时报错的解决方法
Feb 18 Python
Python使用Pickle模块进行数据保存和读取的讲解
Apr 09 Python
Python 循环终止语句的三种方法小结
Jun 24 Python
python模拟鼠标点击和键盘输入的操作
Aug 04 Python
python命令 -u参数用法解析
Oct 24 Python
Python运算符+与+=的方法实例
Feb 18 Python
opencv读取视频并保存图像的方法
Jun 04 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 mysql数据库操作类
2008/06/04 PHP
PHP+Mysql+jQuery实现发布微博程序 jQuery篇
2011/10/08 PHP
PHP 自定义错误处理函数的使用详解
2013/05/10 PHP
迁移PHP版本到PHP7
2015/02/06 PHP
php微信公众平台开发类实例
2015/04/01 PHP
基于Laravel(5.4版本)的基本增删改查操作方法
2019/10/11 PHP
JavaScript 入门·JavaScript 具有全范围的运算符
2007/10/01 Javascript
基于bootstrap3和jquery的分页插件
2015/07/31 Javascript
JS实现点击上移下移LI行数据的方法
2015/08/05 Javascript
如何正确理解javascript的模块化
2017/03/02 Javascript
微信小程序之批量上传并压缩图片的实例代码
2018/07/05 Javascript
微信小程序实现动态获取元素宽高的方法分析
2018/12/10 Javascript
NestJs使用Mongoose对MongoDB操作的方法
2021/02/22 Javascript
python实现指定字符串补全空格的方法
2015/04/30 Python
Python使用迭代器打印螺旋矩阵的思路及代码示例
2016/07/02 Python
python3+pyqt5+itchat微信定时发送消息的方法
2019/02/20 Python
Python爬取知乎图片代码实现解析
2019/09/17 Python
tensorflow实现二维平面模拟三维数据教程
2020/02/11 Python
利用CSS3实现文本框的清除按钮相关的一些效果
2015/06/23 HTML / CSS
美国牙科折扣计划:DentalPlans.com
2019/08/26 全球购物
Oracle快照(snapshot)
2015/03/13 面试题
描述JSP和Servlet的区别、共同点、各自应用的范围
2012/10/02 面试题
金属材料工程毕业生个人的自我评价
2013/11/28 职场文书
销售团队激励口号
2014/06/06 职场文书
护士求职信
2014/07/05 职场文书
我为党旗添光彩演讲稿
2014/09/13 职场文书
机关作风整顿个人整改措施思想汇报
2014/09/29 职场文书
2015年医院药剂科工作总结
2015/05/04 职场文书
先进基层党组织主要事迹材料
2015/11/03 职场文书
如何才能写好调研报告?
2019/07/03 职场文书
实习报告范文
2019/07/30 职场文书
MySQL表的增删改查基础教程
2021/04/07 MySQL
阿里云服务器搭建Php+Apache运行环境的详细过程
2021/05/15 PHP
Python matplotlib可视化之绘制韦恩图
2022/02/24 Python
CSS实现渐变色边框(Gradient borders)的5种方法
2022/03/25 HTML / CSS
css3 选择器
2022/05/11 HTML / CSS