python实现随机验证码(随机大小写字母)

python实现随机验证码

文章目录

  • python实现随机验证码
    • 需要使用的模块、方法、资料:
      • 1.`Image`模块:操作图像类
        • 1.1 `new()`:创建一个新的图片
        • 1.2 `save()`:保存图片
        • 1.3 `putpixel()`:设置像素点颜色
      • 2.`ImageDraw`模块:在图像上作业
        • 2.2`text()`:写入文本
      • 3.`ImageFont`模块:设置字体(`truetype()`)
      • 4.`random`模块:随机数生成
      • 5.字体文件
      • 6.char码值对应列表
      • 7. 报错及解决办法:
        • 7.1 字体问题
    • 实例1:随机生成二维码:大小写字母(代码)

需要使用的模块、方法、资料:

1.Image模块:操作图像类

1.1 new():创建一个新的图片

可实现:创建一个新的图片

实例:创建一个模式:RGB,大小:400*400,颜色:白色的图片

from PIL import Image
# 创建一个模式:RGB,大小:400*400,颜色:白色的图片
im = Image.new(mode="RGB",size=(400,400),color=(255,255,255))
# 展示图片
im.show()

注意:
如果想要修改代码中的图片大小,那么字体大小、字母位置的y坐标,都需要重新设置

1.2 save():保存图片

可实现:将图片保存在本地

实例:将上面创建的图片保存图片至默认地址:项目地址,格式:JPEG

from PIL import Image
# 创建一个模式:RGB,大小:400*400,颜色:白色的图片
im = Image.new(mode="RGB",size=(400,400),color=(255,255,255))
# 保存图片至默认地址:项目地址,格式:JPEG
im.save("pic.jpg",format="JPEG")

1.3 putpixel():设置像素点颜色

(1)可实现:对单个像素点的颜色变化

实例:设置照片的像素点颜色为:黑色

from PIL import Image
# 创建一个模式:RGB,大小:400*400,颜色:白色的图片
im = Image.new(mode="RGB",size=(400,400),color=(255,255,255))
# 获取图片大小,x代表长,y代表宽
x,y = im.size
# 将图片所有的像素点都设置为黑色
for i in range(x):
    for j in range(y):
    	# (i,j)代表像素点位置
    	# (0,0,0)代表黑色
        im.putpixel((i,j),(0,0,0)) 
im.show() # 展示图片

(2)添加random模块,可实现像素点的多样性,形成像素点随机变换

进而,可实现:图片背景的随机性

from PIL import Image
from random
# 创建一个模式:RGB,大小:400*400,颜色:白色的图片
im = Image.new(mode="RGB",size=(400,400),color=(255,255,255))
# 获取图片大小,x代表长,y代表宽
x,y = im.size
# 随机生成图片所有像素点的颜色
for i in range(x):
    for j in range(y):
    	# (i,j)代表像素点位置
    	# random.randint(0,255) 代表随机生成颜色
        im.putpixel((i,j),(random.randint(0,255),(random.randint(0,255),random.randint(0,255))) 
im.show() # 展示图片

2.ImageDraw模块:在图像上作业

2.2text():写入文本

可实现:在图像中写入英文字母

实例:

from PIL import Image,ImageDraw
# 创建一个模式:RGB,大小:400*400,颜色:白色的图片
im = Image.new(mode="RGB",size=(100,50),color=(255,255,255))
# 创建图像绘制对象:PIL.ImageDraw.ImageDraw object
draw = ImageDraw.Draw(im,mode="RGB")
# 使用text方法:将文本:'abcdef',颜色:红色,放置在图像(0,20)位置,
draw.text((0,20),text = 'abcdef',fill="red")
im.show()

3.ImageFont模块:设置字体(truetype()

可实现:字体的多样性

实例:

from PIL import Image,ImageDraw,ImageFont
# 创建一个模式:RGB,大小:400*400,颜色:白色的图片
im = Image.new(mode="RGB",size=(100,50),color=(255,255,255))
draw = ImageDraw.Draw(im,mode="RGB")
# 设置字体格式及字体大小
font1 = ImageFont.truetype("DejaVuSerif-Bold-webfont.ttf",size=20)
draw.text((0,20),text = 'abcdef',fill="red",font=font1)
im.show()

4.random模块:随机数生成

可实现验证码英文字母的多样性

4.1 random.randint():获取整型随机数

可实现:随机在A-Z中选取一个大写英文字母

实例:

import random
# 随机在A-Z中选取一个大写英文字母
print(chr(random.randint(65,90)))

4.2random.choice() :获取随机获取列表中的随机数

可实现:验证码英文大小字母的多样性

import random
# 随机在大写字母和小写字母之间选择一个字母
print(random.choice([chr(random.randint(65,90)),chr(random.randint(97,122))]))

chr(random.randint(65,90)):随机选取一个大写字母

chr(random.randint(97,122)):随机选取一个小写字母

random.choice([chr(random.randint(65,90)),chr(random.randint(97,122))])

在随机选取的大写字母和随机选取的小写字母之间选取一个字母

5.字体文件

可在本机文件中搜索ttf,或者在网上下载一个字体文件,在本实例中,使用的是DejaVuSerif-Bold-webfont.ttf

注意:
如果字体文件存放在其他目录,在添加字体时,需要输入字体文件的绝对地址。

6.char码值对应列表

65-90==A-Z

97-122 对应 a-z

7. 报错及解决办法:

7.1 字体问题

Traceback (most recent call last):
  File "E:/PycharmProjects/Compress_images/comperss.py", line 14, in <module>
    font1 = ImageFont.truetype('KaTeX_Typewriter-Reglar.ttf',30)
  File "D:\pythonsoft\python3.7\lib\site-packages\PIL\ImageFont.py", line 275, in truetype
    return FreeTypeFont(font, size, index, encoding, layout_engine)
  File "D:\pythonsoft\python3.7\lib\site-packages\PIL\ImageFont.py", line 144, in __init__
    self.font = core.getfont(font, size, index, encoding, layout_engine=layout_engine)
OSError: cannot open resource

解决办法:
将第14行代码的字体文件更换成你自己的字体文件

实例1:随机生成二维码:大小写字母(代码)

from PIL import Image,ImageDraw,ImageFont
import random
# 创建一个空白图片,模式为RGB,大小为200*50
im = Image.new('RGB',(200,50),color =(255,255,255))
# 创建画笔
draw = ImageDraw.Draw(im,mode="RGB")
x,y = im.size
# 生成随机背景
for i in range(x):
    for j in range(y):
        # 设置像素点的颜色
        im.putpixel([i, j], (random.randint(0,255),random.randint(0,255),random.randint(0,255)))
# 设置字体
font1 = ImageFont.truetype('DejaVuSerif-Bold-webfont.ttf',30)
# 写入文本
count = 0 # 写入图片的位置
# 生成5个字母
for i in range(5):
    # 生成随机大小写字母文本
    char1 = random.choice([chr(random.randint(65,90)),chr(random.randint(97,122))])
    # 写入文本,位置均匀分布在图像上,颜色随机(0,255),字体为font1,
    draw.text((count, 10), char1, fill=random.randint(0,255), font=font1)
    count += x//5 # 写入五个字母,均匀分布字母至图片
# 画两条阻碍字母的随机横线,随机颜色 ,宽度为3
# 随机横线取值:random.randint(y-30,y-10):字体=20,y=50 :y-30:为与字体的最上方,y-10为与字体的最下方
draw.line((0,random.randint(y-30,y-10),x,random.randint(y-30,y-10)),fill=random.randint(50,200),width=3)
draw.line((0,random.randint(y-30,y-10),x,random.randint(y-30,y-10)),fill=random.randint(100,255),width=3)
# 展示图片
im.show()

输出图片样式:

随机像素点背景+随机大小写字母+随机字母颜色+随机模糊横线*2

在这里插入图片描述

你可能感兴趣的:(python应用)