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简单删除目录下文件以及文件夹的方法
May 27 Python
在Linux系统上部署Apache+Python+Django+MySQL环境
Dec 24 Python
基于Django的python验证码(实例讲解)
Oct 23 Python
Python 将RGB图像转换为Pytho灰度图像的实例
Nov 14 Python
django连接mysql配置方法总结(推荐)
Aug 18 Python
关于Django ForeignKey 反向查询中filter和_set的效率对比详解
Dec 15 Python
python实现Dijkstra静态寻路算法
Jan 17 Python
Flask配置Cors跨域的实现
Jul 12 Python
解决Django中修改js css文件但浏览器无法及时与之改变的问题
Aug 31 Python
Python 实现一个手机号码获取妹子名字的功能
Sep 25 Python
Django Form and ModelForm的区别与使用
Dec 06 Python
PyTorch梯度裁剪避免训练loss nan的操作
May 24 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实现根据字符串生成对应数组的方法
2014/09/22 PHP
php基础设计模式大全(注册树模式、工厂模式、单列模式)
2015/08/31 PHP
jquery tab插件精简版分享
2011/09/10 Javascript
在图片上显示左右箭头类似翻页的代码
2013/03/04 Javascript
九种js弹出对话框的方法总结
2013/03/12 Javascript
jquery DIV撑大让滚动条滚到最底部代码
2013/06/06 Javascript
读取input:file的路径并显示本地图片的方法
2013/09/23 Javascript
js传中文参数controller里获取参数乱码问题解决方法
2014/01/03 Javascript
DOM基础教程之使用DOM + Css
2015/01/20 Javascript
JavaScript获取网页中第一个链接ID的方法
2015/04/03 Javascript
js轮播图代码分享
2016/07/14 Javascript
js获取上传文件的绝对路径实现方法
2016/08/02 Javascript
使用JavaScript解决网页图片拉伸问题(推荐)
2016/11/25 Javascript
js判断一个字符串是以某个字符串开头的简单实例
2016/12/27 Javascript
jquery实现全选、全不选以及单选功能
2017/03/23 jQuery
jquery select插件异步实时搜索实例代码
2017/10/20 jQuery
基于JS实现数字动态变化显示效果附源码
2019/07/18 Javascript
JS实现水平移动与垂直移动动画
2019/12/19 Javascript
Python导入txt数据到mysql的方法
2015/04/08 Python
python3.7.0的安装步骤
2018/08/27 Python
实例详解Matlab 与 Python 的区别
2019/04/26 Python
详解pytorch 0.4.0迁移指南
2019/06/16 Python
pytorch 获取tensor维度信息示例
2020/01/03 Python
Python word文本自动化操作实现方法解析
2020/11/05 Python
程序设计HTML5 Canvas API
2013/04/08 HTML / CSS
如何在发生故障的节点上重新安装 SQL Server
2013/03/14 面试题
一些关于MySql加速和优化的面试题
2014/01/30 面试题
财务助理岗位职责
2013/11/10 职场文书
销售辞职报告范文
2014/01/12 职场文书
《那片绿绿的爬山虎》教学反思
2014/02/27 职场文书
公司营业员的自我评价
2014/03/04 职场文书
党员对照检查剖析材料
2014/10/13 职场文书
2015年大学教师工作总结
2015/05/20 职场文书
Django使用redis配置缓存的方法
2021/06/01 Redis
nginx的zabbix 5.0安装部署的方法步骤
2021/07/16 Servers
php实现自动生成验证码的实例讲解
2021/11/17 PHP