小白都看得懂的使用Python生成随机验证码图片,以及后续优化方案

环境:Anaconda3-2020.02首先我们分解一下需要做什么:生成随机的字母字符串 生成生成随机的背景色 生成随机的字体颜色把随机的字符串用随机的颜色渲染,然后放到一块随机的背景色上面,基本的验证码就好了大概就是这个效果:那么我们来看看如何实现1. 随机的字符串随机字符串的生成比较简单,使用Random库,random.randomint(65, 90)即可...
摘要由CSDN通过智能技术生成

环境:Anaconda3-2020.02

首先我们分解一下需要做什么:

  1. 生成随机的字母字符串
  2. 生成生成随机的背景色
  3. 生成随机的字体颜色

把随机的字符串用随机的颜色渲染,然后放到一块随机的背景色上面,基本的验证码就好了

大概就是这个效果:

那么我们来看看如何实现

1. 随机的字符串

随机字符串的生成比较简单,使用Random库,random.randomint(65, 90)即可(65-90刚好是A-Z的ASCII码)

注意:直接randomint生成出来的是个整数,python是弱类型语言,需要显式指定转化,所以要char(random.randomint(65, 90))

2. 随机的颜色

颜色嘛,RGB嘛,当然是三个random.randomint(0,255)啦,不用多解释吧

(字体和背景都可以复用这个功能)

组合一下,我们就有了初步的代码

import random

class TestCode:
    # 生成一个随机的长度为length的包含A-Z的字符串
    def GenerateRandomChar(self, length=4):
        res = ''
        for i in range(0, length):
            res += (chr(random.randint(65, 90)))  # 生成A-Z
        return res

    # 生成一个随机的字体色
    def GenerateRandomFontColor(self):
        return random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)

    # 生成一个随机的背景色
    def GenerateRandomCanveColor(self):
        return random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)

那么现在我们面临了一个问题:我生成的函数有了!怎么显示!

这个时候就要引入PIL库了,关于PIL的功能有很多文章介绍了,这里就不多赘述。

还是一样,我们来分解一下要做什么:

  1. 需要一块指定随机色的画板
  2. 需要把字显示在上面

怎么做呢?

1. 指定随机色的画板

需要画(图)板(片),那就生成一个:使用PIL的Image.new就行了

2. 显示文字

文字的显示,还是一样利用PIL的功能,使用ImageFont.load_default()加载默认字体,然后用ImageDraw.Draw来画上去

ok想明白了,我们动手写代码:

import random

import PIL.Image as Image
import PIL.ImageDraw as Draw
import PIL.ImageFont as Font


class TestCode:
    # 生成一个随机的长度为length的包含A-Z的字符串
    def GenerateRandomChar(self, length=4):
        res = ''
        for i in range(0, length):
            res += (chr(random.randint(65, 90)))  # 生成A-Z
        return res

    # 生成一个随机的字体色(必然大于(100,100,100))
    def GenerateRandomFontColor(self):
        return random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)

    # 生成一个随机的背景色(必然小于等于80,80,80))
    def GenerateRandomCanveColor(self):
        return random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)

    # 用传入色生成画布
    def GenerateCanve(self, width, height, color):
        return Image.new("RGB",(width, height), color)

    # 测试主函数
    def TestMain(self):
        font = Font.load_default()
        randomStr = self.GenerateRandomChar(10)
        randomFontColor = self.GenerateRandomFontColor()
        randomCanveColor = self.GenerateRandomCanveColor()
        resImg = self.GenerateCanve(300,100,randomCanveColor)
        drawer = Draw.Draw(resImg)
        drawer.text((10,30), text=randomStr, fill=randomFontColor, font=font)
        resImg.show()



if __name__ == '__main__':
    _test = TestCode()
    _test.TestMain()

运行一下:

字,字好小!

怎么办?

让客户买放大镜!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值