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 14 Python
python通过BF算法实现关键词匹配的方法
Mar 13 Python
python实现端口转发器的方法
Mar 13 Python
Python实现简单截取中文字符串的方法
Jun 15 Python
Python删除空文件和空文件夹的方法
Jul 14 Python
Django应用程序中如何发送电子邮件详解
Feb 04 Python
python和ruby,我选谁?
Sep 13 Python
windows下添加Python环境变量的方法汇总
May 14 Python
Pytorch技巧:DataLoader的collate_fn参数使用详解
Jan 08 Python
Python爬虫headers处理及网络超时问题解决方案
Jun 19 Python
基于python实现删除指定文件类型
Jul 21 Python
在Django中使用MQTT的方法
May 10 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
DSP接收机前端设想
2021/03/02 无线电
咖啡店都有些什么常规豆子呢?有什么风味在里面
2021/03/04 咖啡文化
ECMall支持SSL连接邮件服务器的配置方法详解
2014/05/19 PHP
支持png透明图片的php生成缩略图类分享
2015/02/08 PHP
浅谈PHP中output_buffering
2015/07/13 PHP
Laravel中10个有用的用法小结
2019/05/06 PHP
jQuery Ajax异步处理Json数据详解
2013/11/05 Javascript
jquery实现select选择框内容左右移动代码分享
2015/11/21 Javascript
解决jQuery使用JSONP时产生的错误
2015/12/02 Javascript
实例讲解Jquery中隐藏hide、显示show、切换toggle的用法
2016/05/13 Javascript
浅析Vue中method与computed的区别
2018/03/06 Javascript
vue-cli项目中使用公用的提示弹层tips或加载loading组件实例详解
2018/05/28 Javascript
微信小程序模板template简单用法示例
2018/12/04 Javascript
JS函数进阶之继承用法实例分析
2020/01/15 Javascript
用python实现的线程池实例代码
2018/01/06 Python
Tornado Web Server框架编写简易Python服务器
2018/07/28 Python
Linux 修改Python命令的方法示例
2018/12/03 Python
Python 调用PIL库失败的解决方法
2019/01/08 Python
详解利用python+opencv识别图片中的圆形(霍夫变换)
2019/07/01 Python
Python实现把多维数组展开成DataFrame
2019/11/30 Python
Python中url标签使用知识点总结
2020/01/16 Python
pytorch 模型的train模式与eval模式实例
2020/02/20 Python
python中wx模块的具体使用方法
2020/05/15 Python
英国时尚家具、家居饰品及礼品商店:Graham & Green
2016/09/15 全球购物
标签和贴纸印刷:Lightning Labels
2018/03/22 全球购物
Vans奥地利官方网站:美国原创极限运动潮牌
2018/09/30 全球购物
德国综合购物网站:OTTO
2018/11/13 全球购物
千禧酒店及度假村官方网站:Millennium Hotels and Resorts
2019/05/10 全球购物
《手指教学》反思
2014/02/14 职场文书
旅游与环境专业求职信
2014/06/05 职场文书
安全月宣传标语
2014/10/07 职场文书
运动会3000米加油稿
2015/07/21 职场文书
入党积极分子培养联系人意见
2015/08/12 职场文书
2016年世界艾滋病日宣传活动总结
2016/04/01 职场文书
《初涉尘世》读后感3篇
2020/01/10 职场文书
Requests什么的通通爬不了的Python超强反爬虫方案!
2021/05/20 Python