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使用logging结合decorator模式实现优化日志输出的方法
Apr 16 Python
浅谈Python中chr、unichr、ord字符函数之间的对比
Jun 16 Python
Django中ORM表的创建和增删改查方法示例
Nov 15 Python
python 实现数组list 添加、修改、删除的方法
Apr 04 Python
详解Python学习之安装pandas
Apr 16 Python
对python中的控制条件、循环和跳出详解
Jun 24 Python
python之mock模块基本使用方法详解
Jun 27 Python
PyTorch中的padding(边缘填充)操作方式
Jan 03 Python
python scatter函数用法实例详解
Feb 11 Python
python正则表达式实例代码
Mar 03 Python
Django模板之基本的 for 循环 和 List内容的显示方式
Mar 31 Python
python和anaconda的区别
May 06 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音乐采集(部分代码)
2007/02/14 PHP
仿Aspnetpager的一个PHP分页类代码 附源码下载
2012/10/08 PHP
php实现QQ小程序发送模板消息功能
2019/09/18 PHP
浅谈Laravel中的三种中间件的作用
2019/10/13 PHP
css把超出的部分显示为省略号的方法兼容火狐
2008/07/23 Javascript
JavaScript中的关键字&quot;VAR&quot;使用详解 分享
2013/07/31 Javascript
jquery 判断滚动条到达了底部和顶端的方法
2014/04/02 Javascript
JavaScript怎么判断图片是否加载完成以便获取其尺寸
2014/05/08 Javascript
举例说明JavaScript中的实例对象与原型对象
2016/03/11 Javascript
jQuery实现可移动选项的左右下拉列表示例
2016/12/26 Javascript
移动端使用localResizeIMG4压缩图片
2017/04/22 Javascript
JS失效 提示HTML1114: (UNICODE 字节顺序标记)的代码页 utf-8 覆盖(META 标记)的冲突的代码页 utf-8
2017/06/23 Javascript
ES6中Array.copyWithin()函数的用法实例详解
2017/09/16 Javascript
详解PHP后期静态绑定分析与应用
2018/03/21 Javascript
微信小程序实现富文本图片宽度自适应的方法
2019/01/20 Javascript
vue中轮训器的使用
2019/01/27 Javascript
用Golang运行JavaScript的实现示例
2019/11/25 Javascript
开发Node CLI构建微信小程序脚手架的示例
2020/03/27 Javascript
vue使用element-ui实现表单验证
2020/12/13 Vue.js
[01:22:19]EG vs TNC Supermajor小组赛B组败者组第一轮 BO3 第二场 6.2
2018/06/03 DOTA
简单的通用表达式求10乘阶示例
2014/03/03 Python
Python入门及进阶笔记 Python 内置函数小结
2014/08/09 Python
在PyCharm下打包*.py程序成.exe的方法
2018/11/29 Python
使用Python Pandas处理亿级数据的方法
2019/06/24 Python
flask/django 动态查询表结构相同表名不同数据的Model实现方法
2019/08/29 Python
python中return如何写
2020/06/18 Python
几款好用的python工具库(小结)
2020/10/20 Python
PyCharm Community安装与配置的详细教程
2020/11/24 Python
CSS3属性 line-clamp控制文本行数的使用
2020/03/19 HTML / CSS
html5给汉字加拼音加进度条的实现代码
2020/04/07 HTML / CSS
Canvas实现放大镜效果完整案例分析(附代码)
2020/11/26 HTML / CSS
中华魂放飞梦想演讲稿
2014/08/26 职场文书
2014年计划生育协会工作总结
2014/11/14 职场文书
营业员岗位职责
2015/02/11 职场文书
教育教学读书笔记
2015/07/02 职场文书
怎么禁用Windows 11快照布局? win11不使用快照布局的技巧
2021/11/21 数码科技