首先导入PIL
import PIL
创建画板
size=(800, 640)
mode="RGB"
bg_color=(230, 230, 230)
img = Image.new(mode, size, bg_color)
创建画笔
draw = ImageDraw.Draw(img)
生成随机4位验证码
def get_chars():
letter_cases = "abcdefghjkmnpqrstuvwxy" # 小写字母,去除可能干扰的i,l,o,z
upper_cases = _letter_cases.upper() # 大写字母
numbers = ''.join(map(str, range(10))) # 数字
chars = ''.join((letter_cases, upper_cases, numbers))
strs = ' %s ' % ' '.join(random.sample(chars, 4))
return strs
绘制干扰线
def create_lines(draw, img, n_line=1):
"""
@param draw: 画笔
@param img: 画板
@param n_line: 干扰线条数
"""
size = img.size
line_num = random.randint(n_line) # 随机个干扰线条数
for i in range(line_num):
# 起始点
begin = (random.randint(0, size[0]), random.randint(0, size[1]))
# 结束点
end = (random.randint(0, size[0]), random.randint(0, size[1]))
draw.line([begin, end], fill=(0, 0, 0))
绘制干扰点
def create_points(draw, img, point_chance=95):
"""
@param draw: 画笔
@param img: 画板
@param point_chance:干扰点出现的概率
"""
width, height = img.size
chance = min(100, max(0, int(point_chance))) # 大小限制在[0, 100]
for w in range(width):
for h in range(height):
tmp = random.randint(0, 100)
if tmp >= chance:
draw.point((w, h), fill=(0, 0, 0))
生成字体参数
def generate_font(font_type, font_size):
"""
:param font_type: 待画字符串字体
:param font_size: 待画字符串字大小
"""
return ImageFont.truetype(font_type, font_size)
计算验证码的长宽
def calculate_strs_size(strs, font):
"""
:param strs: 待画字符串
:param font: 待画字符串样式,大小,颜色,字体等的集合
"""
# size表示该字符的长宽。offset表示字符到边框的距离,字符到边界还有一段空白
size, offset = font.font.getsize(strs)
width = size[0]
height = size[1]
return width, height
绘制验证码
def create_strs(draw, strs, font, fg_color=(18, 18, 18), begin=(0, 0)):
"""
@param draw: 画笔
@param strs: 待画字符串
@param font: 待画字符串字体和大小
@param fg_color: 待画字符串颜色
@param begin: 待画字符串的起始位置
"""
draw.text(begin, strs, font=font, fill=fg_color)
return
保存图片
img.save(r'D:\xxx/test.jpeg', 'jpeg')
主函数
if __name__ == '__main__':
# 创建画板
size = (800, 640)
mode = "RGB"
bg_color = (230, 230, 230)
img = Image.new(mode, size, bg_color)
# 创建画笔
draw = ImageDraw.Draw(img)
# 生成随机4位验证码
strs = get_chars()
# 绘制干扰线
create_lines(draw, img, 5)
# 绘制干扰点
create_points(draw, img)
# 计算字符起始位置
font_type = r'C:\Windows\Fonts\simhei.ttf'
font_size = 200
font = generate_font(font_type, font_size)
width, height = calculate_strs_size(strs, font)
begin = ((size[0] - width) / 2, (size[1] - height) / 2) # 字符串居中
# 绘制验证码
create_strs(draw, strs, font, begin=begin)
# 保存图片
img.save(r'D:\xxx/test.jpeg', 'jpeg')
效果图:
