Python中用PIL库批量给图片加上序号的教程

Python041

Python中用PIL库批量给图片加上序号的教程,第1张

这篇文章主要介绍了Python中用PIL库批量给图片加上序号的教程,PIL库是Python中一个非常强大的处理图片的库,需要的朋友可以参考下

女友让我给她论文的图片上加上字母序号,本来觉得是个很简单的事情,但那个白底黑字的圆圈序号却难住了我,

试了几个常用的软件,都不行。

后来用

PS

+

动作,倒是能搞出来,不过也不容易,正好那天没搞完,于是拿回自己家做,但我的电脑上又没有

PS,

所以就用

python

实现了。

效果图

这里用的图片全是

240X240

的,按文件名的首字母作为序号,PIL

虽然可以计算文字的尺寸,但类似

D

这样的字符依然不能处于圆圈的正中,所以还对个别字符做了偏移设置,本来想用

aggdraw

画圆圈的,能平滑

一些,不过安装了好几次,都以失败告终,最终放弃。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

#!/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画图,没使用之前是一脸懵的,我使用的开发环境是Pycharm,这个输出的是一行行命令,这个图画在哪里呢? 搜索之后发现,它会弹出一个对话框,然后就开始画了,比如下图第一个常用的库是Turtle,它是Python语言中一个很流行的绘制图像的函数库,这个词的意思就是乌龟,你可以想象下一个小乌龟在一个x和y轴的平面坐标系里,从原点开始根据指令控制,爬行出来就是绘制的图形了。   它最常用的指令就是旋转和移动,比如画个圆,就是绕着圆心移动;再比如上图这个怎么画呢,其实主要就两个命令: turtle.forward(200) turtle.left(170) 第一个命令是移动200个单位并画出来轨迹 第二个命令是画笔顺时针转170度,注意此时并没有移动,只是转角度 然后呢? 循环重复就画出来这个图了 好玩吧。 有需要仔细研究的可以看下这篇文章 https://blog.csdn.net/zengxiantao1994/article/details/76588580 ,这个牛人最后用这个库画个移动的钟表,太赞了。Turtle虽好玩,但是我想要的是我给定数据,然后让它画图,这里就找到另一个常用的画图的库了。 Matplotlib是python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地行制图。其中,matplotlib的pyplot模块一般是最常用的,可以方便用户快速绘制二维图表。 使用起来也挺简单, 首先import matplotlib.pyplot as plt 导入画图的图。 然后给定x和y,用这个命令plt.plot(x, y)就能画图了,接着用plt.show()就可以把图形展示出来。 接着就是各种完善,比如加标题,设定x轴和y轴标签,范围,颜色,网格等等,在 https://blog.csdn.net/guoziqing506/article/details/78975150 这篇文章里介绍的很详细。 现在互联网的好处就是你需要什么内容,基本上都能搜索出来,而且还是免费的。我为什么要研究这个呢?当然是为了用,比如我把比特币的曲线自己画出来可好? 假设现在有个数据csv文件,一列是日期,另一列是比特币的价格,那用这个命令画下: 这两列数据读到pandas中,日期为df['time']列,比特币价格为df['ini'],那我只要使用如下命令 plt.plot(df['time'], df['ini']) plt.show() 就能得到如下图:自己画的是不是很香,哈哈! 然后呢,我在上篇文章 https://www.jianshu.com/p/d4013d8a73de 中介绍过求Ahr999指数,那可不可以也放到这张图中呢?不就是加一条命令嘛 plt.plot(df['time'], df['Ahr999']) 图形如下:但是,Ahr999指数怎么就一条线不动啊, 原来两个Y轴不一致,显示出来太怪了,需要用多Y轴,问题来了。 继续谷歌一下,把第二个Y轴放右边就行了,不过呢得使用多图,重新绘制 fig = plt.figure() # 多图 ax1 = fig.add_subplot(111) ax1.plot(df['time'], df['ini'], label="BTC price")  # 绘制第一个图比特币价格 ax1.set_ylabel('BTC price') # 加上标签# 第二个直接对称就行了 ax2 = ax1.twinx()# 在右边增加一个Y轴 ax2.plot(df['time'], df['Ahr999'], 'r', label="ahr999")  # 绘制第二个图Ahr999指数,红色 ax2.set_ylim([0, 50])# 设定第二个Y轴范围 ax2.set_ylabel('ahr999')plt.grid(color="k", linestyle=":")# 网格 fig.legend(loc="center")#图例 plt.show() 跑起来看看效果,虽然丑了点,但终于跑通了。这样就可以把所有指数都绘制到一张图中,等等,三个甚至多个Y轴怎么加?这又是一个问题,留给爱思考爱学习的你。 有了自己的数据,建立自己的各个指数,然后再放到图形界面中,同时针对异常情况再自动进行提醒,比如要抄底了,要卖出了,用程序做出自己的晴雨表。