zoukankan      html  css  js  c++  java
  • 使用PIL生成验证码

    使用PIL生成二维码的步骤如下:

    1、  需要创建一张白色背景图,指定背景图的长和宽;

    2、  给白色背景图按照每个像素点填充颜色,每个点的颜色随机,可以使用一个生成随机颜色的函数来填充;

    3、  在填充了颜色的图像上绘制字母,这里需要生成字母的函数,可使用生成随机数的函数来生成随机数,然后将随机数转换为字母;需要给每一个字母指定位置,即在图像上的横纵坐标;需要给字母指定字体、大小;需要给字母填充颜色;

    4、  使生成的验证码模糊;

    5、  将绘制好的验证码打印显示。

    示例代码如下:

    from PIL import Image,ImageDraw,ImageFilter,ImageFont
    
    import random
    #生成随机字母A-Z
    def randchar():
        return chr(random.randint(65,90))
    #生成三个随机数,范围为64-255,用来给二维码上的每一个背景点填充颜色
    def rndColor1():
        return (random.randint(64,255),random.randint(64,255),random.randint(64,255))
    #生成三个随机数,范围为32-128,用来给二维码上的字母填充颜色,为避免颜色与背景重合,故设置与背景颜色范围不同
    def rndColor2():
        return (random.randint(32,128),random.randint(32,128),random.randint(32,128))
    
    width=240#二维码的长
    height=60#二维码的高
    #创建一张新图片,颜色纯白,这样方便在图片上填充颜色、增加字母
    img = Image.new("RGB", (width, height), (255, 255, 255))
    #设置字母的字体类型,使用系统字体,将系统字体文件复制并放置于程序文件所在目录
    font = ImageFont.truetype("arial.ttf", 36)
    #在img上绘图
    draw = ImageDraw.Draw(img)
    #为所有的点填充颜色
    for x in range(width):
        for y in range(height):
            draw.point((x, y), fill=rndColor1())
    #在图片上增加字母,在长度方向上放置4个字母,字母由自定义函数rndchar()随机生成,字母颜色由rndColor2()填充
    for i in range(4):
        draw.text((60 * i+20, 10), randchar(), font=font, fill=rndColor2())
    #使验证码模糊
    img = img.filter(ImageFilter.BLUR)
    img.show()
    img.save("code.jpg", "jpeg")
  • 相关阅读:
    Bit Manipulation
    218. The Skyline Problem
    Template : Two Pointers & Hash -> String process
    239. Sliding Window Maximum
    159. Longest Substring with At Most Two Distinct Characters
    3. Longest Substring Without Repeating Characters
    137. Single Number II
    142. Linked List Cycle II
    41. First Missing Positive
    260. Single Number III
  • 原文地址:https://www.cnblogs.com/puheng/p/9242264.html
Copyright © 2011-2022 走看看