返回
软件
分类

需要使用PIL模块. 安装,这里示范的验证码都是简单的

日期: 2020-01-02 08:09 浏览次数 : 115

随机验证码,

Python生成随机验证码,需要使用PIL模块.

安装:

1 pip3 install pillow

Python简单的制作图片验证码,

-人人可以学Python--
这里示范的验证码都是简单的,你也可以把字符扭曲

必赢备用网址 1
人人可以学Python.png

Python第三方库无比强大,PIL 是python的一个d第三方图片处理模块,我们也可以使用它来生成图片验证码
PIL安装
命令安装:

pip install pillow

下载源码安装:
复制地址 :

基本使用

  1. 创建图片
1 2 3 4 5 6 7 8 9 from PIL import Image img = Image.new(mode='RGB', size=(12030), color=(255255255))    # 在图片查看器中打开 # img.show()    # 保存在本地 with open('code.png','wb') as f:     img.save(f,format='png')
  1. 创建画笔,用于在图片上画任意内容
1 2 img = Image.new(mode='RGB', size=(12030), color=(255255255)) draw = ImageDraw.Draw(img, mode='RGB')
  1. 必赢备用网址 ,画点
1 2 3 4 5 6 img = Image.new(mode='RGB', size=(12030), color=(255255255)) draw = ImageDraw.Draw(img, mode='RGB') # 第一个参数:表示坐标 # 第二个参数:表示颜色 draw.point([100100], fill="red") draw.point([300300], fill=(255255255))
  1. 画线
1 2 3 4 5 6 img = Image.new(mode='RGB', size=(12030), color=(255255255)) draw = ImageDraw.Draw(img, mode='RGB') # 第一个参数:表示起始坐标和结束坐标 # 第二个参数:表示颜色 draw.line((100,100,100,300), fill='red') draw.line((100,100,300,100), fill=(255255255))

5. 画圆

1 2 3 4 5 6 7 img = Image.new(mode='RGB', size=(12030), color=(255255255)) draw = ImageDraw.Draw(img, mode='RGB') # 第一个参数:表示起始坐标和结束坐标(圆要画在其中间) # 第二个参数:表示开始角度 # 第三个参数:表示结束角度 # 第四个参数:表示颜色 draw.arc((100,100,300,300),0,90,fill="red")
  1. 写文本
1 2 3 4 5 6 img = Image.new(mode='RGB', size=(12030), color=(255255255)) draw = ImageDraw.Draw(img, mode='RGB') # 第一个参数:表示起始坐标 # 第二个参数:表示写入内容 # 第三个参数:表示颜色 draw.text([0,0],'python',"red")
  1. 特殊字体文字
1 2 3 4 5 6 7 8 9 10 img = Image.new(mode='RGB', size=(12030), color=(255255255)) draw = ImageDraw.Draw(img, mode='RGB') # 第一个参数:表示字体文件路径 # 第二个参数:表示字体大小 font = ImageFont.truetype("kumo.ttf"28) # 第一个参数:表示起始坐标 # 第二个参数:表示写入内容 # 第三个参数:表示颜色 # 第四个参数:表示颜色 draw.text([00], 'python'"red", font=font)

PIL使用

例子:生成图片,并填充文字

#!/usr/bin/python
#-*-coding:utf-8-*-
from PIL import Image, ImageDraw, ImageFont, ImageFilter
# 实例一个图片对象240 x 60:
width = 60 * 4
height = 60
# 图片颜色
clo = (43, 34, 88) # 我觉得是紫蓝色
image = Image.new('RGB', (width, height), clo)

# 创建Font对象:
# 字体文件可以使用操作系统的,也可以网上下载
font = ImageFont.truetype('./font/Arial.ttf', 36)

# 创建Draw对象:
draw = ImageDraw.Draw(image)

# 输出文字:
str1 = "ren ren Python"
w = 4  #距离图片左边距离
h = 10 #距离图片上边距离
draw.text((w, h), str1, font=font)
# 模糊:
image.filter(ImageFilter.BLUR)
code_name = 'test_code_img.jpg'
save_dir = './{}'.format(code_name)
image.save(save_dir, 'jpeg')
print("已保存图片: {}".format(save_dir))

(venv) [email protected]~/renren/code$ python test2.py 
已保存图片: ./test_code_img.jpg

图片如下:

必赢备用网址 2
Paste_Image.png

文字没有什么色彩,我们也可以加上颜色,只需要在 text 中传人 fill 参数就好
draw.text((w, h), str1, font=font, fill = (78, 64, 65))
随便加的颜色

必赢备用网址 3
Paste_Image.png

我们还可以把背景弄成很多个小点,每隔n隔像素填充个其他颜色比如:

#!/usr/bin/python
#-*-coding:utf-8-*-
from PIL import Image, ImageDraw, ImageFont, ImageFilter
# 实例一个图片对象240 x 60:
width = 60 * 4
height = 60
# 图片颜色
clo = (43, 34, 88) # 我觉得是紫蓝色
image = Image.new('RGB', (width, height), clo)

# 创建Font对象:
# 字体文件可以使用操作系统的,也可以网上下载
font = ImageFont.truetype('./font/Arial.ttf', 36)

# 创建Draw对象:
draw = ImageDraw.Draw(image)

# 填充像素:
# 宽每隔 20, 高每隔5, 形成坐标x,y
# 红色:220,20,60
for x in range(0, width, 20):
    for y in range(0, height, 5):
        draw.point((x, y), fill=(220, 20, 60))

# 输出文字:
str1 = "we are renren"
w = 4  #距离图片左边距离
h = 10 #距离图片上边距离
draw.text((w, h), str1, font=font, fill = (78, 64, 65))
# 模糊:
image.filter(ImageFilter.BLUR)
code_name = 'test_code_img.jpg'
save_dir = './{}'.format(code_name)
image.save(save_dir, 'jpeg')
print("已保存图片: {}".format(save_dir))

结果图片:

必赢备用网址 4
Paste_Image.png

图片验证码

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 import random    def check_code(width=120, height=30, char_length=5, font_file='kumo.ttf', font_size=28):     code = []     img = Image.new(mode='RGB', size=(width, height), color=(255255255))     draw = ImageDraw.Draw(img, mode='RGB')        def rndChar():         """         生成随机字母           :return:         """         return chr(random.randint(6590))        def rndColor():         """         生成随机颜色         :return:         """         return (random.randint(0255), random.randint(10255), random.randint(64255))        # 写文字     font = ImageFont.truetype(font_file, font_size)     for in range(char_length):         char = rndChar()         code.append(char)         = random.randint(04)         draw.text([i * width / char_length, h], char, font=font, fill=rndColor())        # 写干扰点     for in range(40):         draw.point([random.randint(0, width), random.randint(0, height)], fill=rndColor())        # 写干扰圆圈     for in range(40):         draw.point([random.randint(0, width), random.randint(0, height)], fill=rndColor())         = random.randint(0, width)         = random.randint(0, height)         draw.arc((x, y, x + 4, y + 4), 090, fill=rndColor())        # 画干扰线     for 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__':     # 1. 直接打开     # img,code = check_code()     # img.show()        # 2. 写入文件     # img,code = check_code()     # with open('code.png','wb') as f:     #     img.save(f,format='png')        # 3. 写入内存(Python3)     # from io import BytesIO     # stream = BytesIO()     # img.save(stream, 'png')     # stream.getvalue()        # 4. 写入内存(Python2)     # import StringIO     # stream = StringIO.StringIO()     # img.save(stream, 'png')     # stream.getvalue()        pass

Python生成随机验证码,需要使用PIL模块. 安装: 1 pip3 install pillow 基本使用 1. 创建图片 123456789 from PIL import Image img = Image.new...

PIL制作验证码

利用以上这些,还有我们之前学习的随机生成器random就可以做个验证码了,
生成验证码代码

#!/usr/bin/python
#-*-coding:utf-8-*-
from uuid import uuid1
from PIL import Image, ImageDraw, ImageFont, ImageFilter
import random
def rnd_char():
    '''
    随机一个字母或者数字
    :return: 
    '''
    # 随机一个字母或者数字
    i = random.randint(1,3)
    if i == 1:
        # 随机个数字的十进制ASCII码
        an = random.randint(97, 122)
    elif i == 2:
        # 随机个小写字母的十进制ASCII码
        an = random.randint(65, 90)
    else:
        # 随机个大写字母的十进制ASCII码
        an = random.randint(48, 57)
    # 根据Ascii码转成字符,return回去
    return chr(an)

# 干扰
def rnd_dis():
    '''
    随机一个干扰字
    :return: 
    '''
    d = ['^','-', '~', '_', '.']
    i = random.randint(0, len(d)-1)
    return d[i]

# 两个随机颜色都规定不同的区域,防止干扰字符和验证码字符颜色一样
# 随机颜色1:
def rnd_color():
    '''
    随机颜色,规定一定范围
    :return: 
    '''
    return (random.randint(64, 255), random.randint(64, 255), random.randint(64, 255))

# 随机颜色2:
def rnd_color2():
    '''
      随机颜色,规定一定范围
      :return: 
      '''
    return (random.randint(32, 127), random.randint(32, 127), random.randint(32, 127))

def create_code():
    # 240 x 60:
    width = 60 * 4
    height = 60
    image = Image.new('RGB', (width, height), (192, 192, 192))
    # 创建Font对象:
    font = ImageFont.truetype('./font/Arial.ttf', 36)

    # 创建Draw对象:
    draw = ImageDraw.Draw(image)

    # 填充每个像素:
    for x in range(0, width, 20):
        for y in range(0, height, 10):
            draw.point((x, y), fill=rnd_color())

    # 填充字符
    _str = ""
    # 填入4个随机的数字或字母作为验证码
    for t in range(4):
        c = rnd_char()
        _str = "{}{}".format(_str, c)

        # 随机距离图片上边高度,但至少距离30像素
        h = random.randint(1, height-30)
        # 宽度的化,每个字符占图片宽度1/4,在加上10个像素空隙
        w = width/4 * t + 10
        draw.text((w, h), c, font=font, fill=rnd_color2())

    # 实际项目中,会将验证码 保存在数据库,并加上时间字段
    print("保存验证码 {} 到数据库".format(_str))

    # 给图片加上字符干扰,密集度由 w, h控制
    for j in range(0, width, 30):
        dis = rnd_dis()
        w = t * 15 + j

        # 随机距离图片上边高度,但至少距离30像素
        h = random.randint(1, height - 30)
        draw.text((w, h), dis, font=font, fill=rndColor())

    # 模糊:

    image.filter(ImageFilter.BLUR)

    # uuid1 生成唯一的字符串作为验证码图片名称
    code_name = '{}.jpg'.format(uuid1())
    save_dir = './{}'.format(code_name)
    image.save(save_dir, 'jpeg')
    print("已保存图片: {}".format(save_dir))

# 当直接运行文件的是和,运行下面代码
if __name__ == "__main__":
    create_code()

(venv) [email protected]~/renren/code$ python test.py 
保存验证码 ef3k 到数据库
已保存图片: ./c86e03c0-1c23-11e7-999d-f45c89c09e61.jpg
(venv) [email protected]~/renren/code$ python test.py 
保存验证码 I37X 到数据库
已保存图片: ./cb8aed02-1c23-11e7-9b18-f45c89c09e61.jpg
(venv) [email protected]~/renren/code$ python test.py 
保存验证码 vVL1 到数据库
已保存图片: ./cc120da8-1c23-11e7-b762-f45c89c09e61.jpg
(venv) [email protected]~/renren/code$ python test.py 
保存验证码 K6w3 到数据库
已保存图片: ./cc891e05-1c23-11e7-b7ec-f45c89c09e61.jpg

必赢备用网址 5
Paste_Image.png 必赢备用网址 6
Paste_Image.png 必赢备用网址 7
Paste_Image.png 必赢备用网址 8
Paste_Image.png

你觉得难不难呢?最后这个生成验证码代码中有些逻辑问题要理解下

学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入学习交流群
626062078,我们一起学Python!

-人人可以学Python-- 这里示范的验证码都是简单的,你也可以把字符扭曲 人人可以学Python.png Python第三方库无...