Python生成验证码

小咪咪 2023-06-23 11:58 79阅读 0赞

Python生成验证码 需要用到Pillow 模块(pip install pillow);

一. Pillow 模块使用的简单记录

1.导入模块
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
2.实例化
2.1 实例化图片对象
  ImageCaptcha = Image.new(mode, sizee, color)
2.2 创建画笔
  ImageDraw = ImageDraw.Draw(self.ImageCaptcha)
3.画图
3.1.画文字
  ImageDraw .text(xy, text,fill,font)
  xy:字体的坐标(字体的左上角的坐标),
  text:指定的文本内容,
  fill:指定文本的颜色,
  font:指定字体文件(通过ImageFont类来定义)
3.2.画线条
  ImageDraw.line(xy=[begin, end], fill=fill, width=width)
  xy:线条的起始位置,结束位置,
  fill:指定文本的颜色,
  width:线条粗细
3.3.画矩形
  ImageDraw.rectangle( xy, fill=None, outline=None, width=0)
  xy:对角线的起始位置,到结束位置,
  fill:填充颜色,
  outline:指定线条的颜色
3.4.画椭圆
  ImageDraw.arc(xy, start, end, fill=None, width=0)
  xy:椭圆的外切矩形的对角线的起始位置,到结束位置,
  start:起始角度,
  end:结束角度,
  fill:填充颜色,
3.4.画圆
  ImageDraw.pieslice(self, xy, start, end, fill=None, outline=None, width=0)
  xy:圆的外切矩形的对角线的起始位置,到结束位置,
  start:起始角度,
  end:结束角度,
  fill:填充颜色,
  outline:指定线条的颜色
3.4.画点
  ImageDraw.point(self, xy, fill=None)
  xy:坐标,
  fill:填充颜色,

二. 生成一个图片验证码
  1. #!/usr/bin/env python3
  2. #_*_ coding:utf-8 _*_
  3. import string
  4. import random
  5. from PIL import Image, ImageDraw, ImageFont, ImageFilter
  6. class CreateImageCaptcha(object):
  7. def __init__(self,
  8. font_type, # 必须提供字体文件
  9. size=(160, 60),
  10. str_characters=string.digits + string.ascii_letters,
  11. str_len=4,
  12. font_sizes=range(40, 50),
  13. bg_color='pink',
  14. draw_lines_or_no=True,
  15. line_number=(4, 6),
  16. draw_points_or_no=True,
  17. ):
  18. """ :param font_type: 字体文件;必须提供字体文件 :param size: 图片大小 默认(160, 60) :param str_characters: 字符集;默认字母+数字 :param str_len: 绘制的字符数量;默认4个字符 :param font_sizes: 绘制的字符字体大小;默认40-50 :param bg_color: 背景颜色;默认为pink' :param draw_lines_or_no: 是否划干扰线;默认打开 :param line_number: 干扰线的条数范围; :param draw_points_or_no: 是否画干扰点;默认打开 """
  19. self.Image_width, self.Image_height = size
  20. self.str_characters = str_characters
  21. self.str_len = str_len
  22. self.random_str = ''.join(random.sample(self.str_characters, str_len))
  23. self.Image_fonts = font_type
  24. self.Image_font_sizes = font_sizes
  25. self.Image_bg_color = bg_color
  26. self.draw_lines_or_no = draw_lines_or_no
  27. self.line_number = line_number
  28. self.draw_points_or_no = draw_points_or_no
  29. #
  30. self.ImageCaptcha = Image.new(mode='RGB', size=size, color=self.Image_bg_color) # 实例化图片对象
  31. self.ImageDraw = ImageDraw.Draw(self.ImageCaptcha) # 创建画笔
  32. def get_random_Color(self):
  33. """随机颜色"""
  34. c1 = random.randint(10, 200)
  35. c2 = random.randint(10, 200)
  36. c3 = random.randint(10, 200)
  37. return (c1, c2, c3)
  38. def draw_str_(self):
  39. """画字符"""
  40. # 提供字体
  41. font = ImageFont.truetype(font=self.Image_fonts, size=random.choice(self.Image_font_sizes))
  42. w_width = self.Image_width / self.str_len # 将图片宽度按字符个数等分
  43. for index, str in enumerate(self.random_str):
  44. font_width, font_height = font.getsize(str) # 获取字符的宽和高
  45. # print(font_width, font_height)
  46. font_space_w = int(w_width - font_width) # 用图片等分的宽减去字符宽,得到字符在这个区域横向活动范围
  47. font_space_h = int(self.Image_height - font_height) # 用图片高减去字符宽,得到字符在这个区域纵向活动范围
  48. # 根据活动范围,计算每个字符绘画的起始位置
  49. xy = (w_width*index + random.choice(range(0, font_space_w)), random.choice(range(0, font_space_h)))
  50. # 传参,画字符
  51. self.ImageDraw.text(xy=xy, text=str, font=font, fill=self.get_random_Color())
  52. def draw_line_(self):
  53. """画干扰线"""
  54. if self.draw_lines_or_no:
  55. line_num = random.randint(*self.line_number) # 随机干扰线条数
  56. for i in range(line_num):
  57. # 起始点
  58. begin = (random.randint(0, self.Image_width), random.randint(0, self.Image_height))
  59. # 结束点
  60. end = (random.randint(0, self.Image_width), random.randint(0, self.Image_height))
  61. # 线颜色
  62. fill = self.get_random_Color()
  63. # 线粗细
  64. width = random.choice(range(6))
  65. # 传参,画线条
  66. self.ImageDraw.line(xy=[begin, end], fill=fill, width=width)
  67. def draw_points_(self):
  68. """画干扰点"""
  69. if self.draw_points_or_no:
  70. proints_number = random.choice(range(500, 600))
  71. for n in range(proints_number):
  72. x = int(random.choice(range(self.Image_width)))
  73. y = int(random.choice(range(self.Image_height)))
  74. fill = self.get_random_Color()
  75. self.ImageDraw.point(xy=(x, y), fill=fill)
  76. # # 图片旋转
  77. def rotate_(self):
  78. deg = int(self.Image_height / 3) # 旋转角度
  79. self.ImageCaptcha = self.ImageCaptcha.rotate(random.randint(0, deg), expand=0)
  80. def create_image(self):
  81. self.draw_str_()
  82. self.draw_line_()
  83. self.draw_points_()
  84. return self.ImageCaptcha, self.random_str
  85. if __name__ == '__main__':
  86. # 字体文件
  87. font_type = 'fanxinshu.TTF'
  88. # 实例化创建验证码的类
  89. create = CreateImageCaptcha(font_type=font_type)
  90. imgs, str = create.create_image()
  91. print(str)
  92. imgs.save('my_test.png')

发表评论

表情:
评论列表 (有 0 条评论,79人围观)

还没有评论,来说两句吧...

相关阅读

    相关 验证生成

    视图函数里 > 1,导入图片,画布,画笔,画笔上的字体,定义坐标 > 2,从外部导入字体(字体导入到static静态中) > 3,随机生成验证码,验证码颜色,验证