图像处理框架PIL(二)——利用PIL制作验证码

*爱你&永不变心* 提交于 2020-01-12 03:51:07
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()

显示效果:
在这里插入图片描述

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!