环境:Anaconda3-2020.02
首先我们分解一下需要做什么:
- 生成随机的字母字符串
- 生成生成随机的背景色
- 生成随机的字体颜色
把随机的字符串用随机的颜色渲染,然后放到一块随机的背景色上面,基本的验证码就好了
大概就是这个效果:
那么我们来看看如何实现
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. 指定随机色的画板
需要画(图)板(片),那就生成一个:使用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()
运行一下:
字,字好小!
怎么办?
让客户买放大镜!