• python 生成验证码图片(python generate captCHA images)


     

    python 生成验证码图片

    来自 《Python项目案例开发从入门到实战》(清华大学出版社 郑秋生 夏敏捷主编)中图像处理——生成二维码和验证码

     1 import random
     2 import string
     3 from PIL import Image, ImageDraw, ImageFont, ImageFilter
     4 
     5 
     6 # 用来随机生成一个字符串
     7 def gene_text(number):
     8     # 生成52个大小写英文字母
     9     source = list(string.ascii_letters)
    10     # 添加上数字
    11     for index in range(0, 10):
    12         source.append(str(index))
    13     return ''.join(random.sample(source, number))  # number是生成验证码的位数
    14 
    15 
    16 # 用来绘制干扰线
    17 def gene_line(draw, width, height, linecolor):
    18     # random.randint(a, b)用于生成一个指定范围内的证书,其中第一个参数a是上限,第二个参数b是下限,生成的随机数n:a<=n<=b
    19     begin = (random.randint(0, width), random.randint(0, height))
    20     end = (random.randint(0, width), random.randint(0, height))
    21     # 在图像上画线,参数值为线的起始和终止位置坐标[(x, y), (x, y)]和线的填充颜色
    22     draw.line([begin, end], fill=linecolor)
    23 
    24 
    25 # 生成验证码
    26 def gene_code(size, bgcolor, font_path, number, draw_line, fontcolor):
    27     # 宽和高
    28     width, height = size
    29     # 创建图片, 'RGBA'表示4*8位像素,真彩+透明通道
    30     image = Image.new('RGBA', (width, height), bgcolor)
    31     # 验证码的字体。ImageFont这个函数从指定的文件加载了一个字体对象,并且为指定大小的字体创建了字体对象。
    32     font = ImageFont.truetype(font_path, 25)
    33     # 创建画笔,创建可用于绘制给定图像的对象
    34     draw = ImageDraw.Draw(image)
    35     # 随机生成想要的字符串
    36     text = gene_text(number)
    37     # 返回给定文本的宽度和高度,返回值为2元组
    38     font_width, font_height = font.getsize(text)
    39     # 填充字符串,参数分别是:文本的左上角坐标,文本内容,字体,文本的填充颜色
    40     draw.text(((width-font_width)/number, (height-font_height)/number), text, font=font, fill=fontcolor)
    41     
    42     if draw_line:
    43         # 计算要画的线的条数
    44         line_count = random.randint(line_number[0], line_number[1])
    45         print('line_count = ', line_count)
    46         for i in range(line_count):
    47             gene_line(draw, width, height, linecolor)
    48     # 创建扭曲,transform(size, method, data) 其中第一个参数是尺寸大小, Image.AFFINE表示仿射变化
    49     # 第三个参数是转换方法的额外数据, Image.BILINEAR是线性插值法
    50     image = image.transform((width+20, height+10), Image.AFFINE, (1, -0.3, 0, -0.1, 1, 0), Image.BILINEAR)
    51     # 滤镜,边界加强,ImageFilter.EDGE_ENHANCE_MORE为深度边缘增强滤波,会使得图像中边缘部分更加明显。
    52     image = image.filter(ImageFilter.EDGE_ENHANCE_MORE)
    53     # 保存验证码图片
    54     image.save('idencode.png')
    55 
    56 
    57 if __name__ == "__main__":
    58     # 字体的位置
    59     font_path = 'FangZhengFangSongJianTi-1.ttf'
    60     # 生成几位数的验证码
    61     number = 4
    62     # 生成验证码图片的高度和宽度
    63     size = (80, 30)
    64     # 背景颜色,默认为白色
    65     bgcolor = (255, 255, 255)
    66     # 字体颜色,默认为蓝色
    67     fontcolor = (0, 0, 255)
    68     # 干扰线颜色,默认为红色
    69     linecolor = (255, 0, 0)
    70     # 是否加入干扰线
    71     draw_line = True
    72     # 假如干扰线条数的上/下限
    73     line_number = (1, 5)
    74     # 调用生成验证码diamante
    75     gene_code(size, bgcolor, font_path, number, draw_line, fontcolor)

    其中字体下载的是方正仿宋简体

    结果图:

  • 相关阅读:
    《流畅的Python》Data Structures--第7章 colsure and decorator
    CSS Reset 2.0标准
    Layout
    一个简单的例子 vux mutation改变状态
    __WEBPACK_IMPORTED_MODULE_3_vuex__.a is not a constructor
    vuex 使用
    (转)Vue-初步了解vue-router的三要素:路由map 、路由视图、路由导航
    router-link-active 和 router-link-exact-active router-link-active
    当前目录 根目录 写法
    mode: 'history', 去掉路由地址的#
  • 原文地址:https://www.cnblogs.com/ttweixiao-IT-program/p/13528427.html
Copyright © 2020-2023  润新知