目录
一. 什么是PIL二. 安装PIL模块三.生成验证码1. 生成随机字母2. 生成随机颜色3.获取验证码图片4.封装代码
一. 什么是PIL
PIL:是Python Image Library的缩写,图像处理的模块。主要的类包括Image,ImageFont,ImageDraw,ImageFilter
二. 安装PIL模块
pip install Pillow
然后就可以调用类:
from PIL
import Image
, ImageDraw
, ImageFont
, ImageFilter
三.生成验证码
1. 生成随机字母
def rndChar():
"""生成随机字母"""
return chr(random
.randint
(65, 90))
2. 生成随机颜色
def rndColor():
"""生成随机颜色(RGB格式)"""
r
= random
.randint
(0, 255)
g
= random
.randint
(0, 255)
b
= random
.randint
(0, 255)
return (r
,g
,b
)
3.获取验证码图片
def check_code(width
=120, height
=30, char_length
=5, font_file
='Monaco.ttf', font_size
=28):
code
= []
img
= Image
.new
(mode
='RGB', size
=(width
, height
), color
=(255, 255, 255))
draw
= ImageDraw
.Draw
(img
, mode
='RGB')
font
= ImageFont
.truetype
(font_file
, font_size
)
for i
in range(char_length
):
char
= rndChar
()
code
.append
(char
)
h
= random
.randint
(0, 4)
draw
.text
([i
* width
/ char_length
, h
], char
, font
=font
, fill
=rndColor
())
for i
in range(40):
draw
.point
([random
.randint
(0, width
), random
.randint
(0, height
)], fill
=rndColor
())
for i
in range(40):
draw
.point
([random
.randint
(0, width
), random
.randint
(0, height
)], fill
=rndColor
())
x
= random
.randint
(0, width
)
y
= random
.randint
(0, height
)
draw
.arc
((x
, y
, x
+ 4, y
+ 4), 0, 90, fill
=rndColor
())
for i
in range(5):
x1
= random
.randint
(0, width
)
y1
= random
.randint
(0, height
)
x2
= random
.randint
(0, width
)
y2
= random
.randint
(0, height
)
draw
.line
((x1
, y1
, x2
, y2
), fill
=rndColor
())
img
= img
.filter(ImageFilter
.EDGE_ENHANCE_MORE
)
return img
, ''.join
(code
)
4.封装代码
from PIL
import Image
, ImageDraw
, ImageFont
, ImageFilter
import random
def check_code(width
=120, height
=30, char_length
=5, font_file
='Monaco.ttf', font_size
=28):
code
= []
img
= Image
.new
(mode
='RGB', size
=(width
, height
), color
=(255, 255, 255))
draw
= ImageDraw
.Draw
(img
, mode
='RGB')
def rndChar():
"""
生成随机字母
:return:
"""
return chr(random
.randint
(65, 90))
def rndColor():
"""
生成随机颜色
:return:
"""
return (random
.randint
(0, 255), random
.randint
(10, 255), random
.randint
(64, 255))
font
= ImageFont
.truetype
(font_file
, font_size
)
for i
in range(char_length
):
char
= rndChar
()
code
.append
(char
)
h
= random
.randint
(0, 4)
draw
.text
([i
* width
/ char_length
, h
], char
, font
=font
, fill
=rndColor
())
for i
in range(40):
draw
.point
([random
.randint
(0, width
), random
.randint
(0, height
)], fill
=rndColor
())
for i
in range(40):
draw
.point
([random
.randint
(0, width
), random
.randint
(0, height
)], fill
=rndColor
())
x
= random
.randint
(0, width
)
y
= random
.randint
(0, height
)
draw
.arc
((x
, y
, x
+ 4, y
+ 4), 0, 90, fill
=rndColor
())
for i
in range(5):
x1
= random
.randint
(0, width
)
y1
= random
.randint
(0, height
)
x2
= random
.randint
(0, width
)
y2
= random
.randint
(0, height
)
draw
.line
((x1
, y1
, x2
, y2
), fill
=rndColor
())
img
= img
.filter(ImageFilter
.EDGE_ENHANCE_MORE
)
return img
, ''.join
(code
)
if __name__
== '__main__':
img
= ValidCodeImg
()
image_object
, code
= img
.check_code
()
print(code
)
"""
with open('code.png', 'wb') as f:
image_object.save(f, format='png')
"""
"""
# 把图片的内容写到内存 stream
from io import BytesIO
stream = BytesIO()
image_object.save(stream, 'png')
stream.getvalue()
"""