from PIL import Image, ImageDraw, ImageFont
import numpy as np
'''
第一、验证码文字生成
1. 第一验证码中的字母的生成:无法直接生成字母,但是字母和数字之间可以通过ASCII值可以进行转换
规则是:数字65~90为26个大写英文字母,数字97~122号为26个小写英文字母。所以只要生成65——122
之间的数字,就可以得到相应的字母。
2. chr(数字:可以是10进制也可以是16进制的形式的数字),将数字转换为对应的 ASCII 字符。
>>>print chr(0x30), chr(0x31), chr(0x61) # 十六进制
0 1 a
>>> print chr(48), chr(49), chr(97) # 十进制
0 1 a
3. ord("字符")
>>> ord('A')
65
第二、验证码背景色和前景色生成
1. 前景色:60-120
2. 背景色生成:90-200, 为了让前景和背景色接近,使得验证码模糊,要让前景和背景色要有交融
'''
class ValidateCode(object):
# 设置字体,在系统里面找到fonts文件夹,找字体。
font = ImageFont.truetype(font=r"C:\Windows\Fonts\Inkfree.ttf", size=32)
# 生成随机数,用于产生大写字母
def generateCode(self):
return chr(np.random.randint(65, 122))
# 产生前景色,因为是彩色图像,所以要有三个通道。
def generateForward(self):
return (np.random.randint(40, 100), np.random.randint(30, 100), np.random.randint(20, 100))
# 产生背景色,背景色要与前景色交融,这样才能使得验证码模糊,防止爬虫
def generateBackward(self):
return (np.random.randint(100, 126), np.random.randint(100, 120), np.random.randint(100, 126))
# 新建一个RGB的画板,为其设置尺寸和颜色(一般为白色)
def Panel(self):
panel = Image.new("RGB", size=(220, 50), color=(255, 255, 255))
return panel
# 生成验证码
def generateValidate(self):
panel = self.Panel()
# A simple 2D drawing interface for PIL images.
draw = ImageDraw.Draw(panel)
w, h = panel.size
# 画背景 draw.point(),因为背景是由像素点组成,所以要画出与画板大小一样多的像素点构成背景图片
for y in range(h):
for x in range(w):
# 画像素点
draw.point((x, y), fill=self.generateBackward())
for i in range(4):
draw.text((i*60+10, 10), text=self.generateCode(), fill=self.generateForward(), font=self.font)
panel.show()
# 显示验证码的像素直方图
def historgram(self):
img = Image.open("image/validate.jpg")
data = np.array(img)
# print(data.shape)
# 绘制直方图
# hist = img.histogram()
# print(hist)
plt.subplot(2, 1, 1)
plt.imshow(img)
plt.subplot(2, 1, 2)
plt.hist(data.flatten(), bins=256)
plt.show()
if __name__ == '__main__':
v = ValidateCode()
# 生成验证码
v.generateValidate()
# 查看生成验证码的直方图
v.historgram()
显示效果:
来源:CSDN
作者:gwpjiayou
链接:https://blog.csdn.net/gwpjiayou/article/details/103873728