文章链接:https://mp.weixin.qq.com/s/LYUBRNallHcjnhJb1R3ZBg

日常在网站使用过程中经常遇到图形验证,今天准备自己做个图形验证码,这算是个简单的功能,也适合新手练习的,便于自己学习。

主要用到的库--PIL图像处理库,简单的思路,我们需要随机的颜色,随机的数字或字母,随机的线条、点作为干扰元素 拼凑成一张图片。

生成随机颜色,返回的是rgb三色。

def getRandomColor():
r = random.randint(0, 255)
g = random.randint(0, 255)
b = random.randint(0, 255)
return (r, g, b)

从数字、大小写字母里生成随机字符。

def getRandomChar():
random_num = str(random.randint(0, 9))
random_lower = chr(random.randint(97, 122)) # 小写字母a~z
random_upper = chr(random.randint(65, 90)) # 大写字母A~Z
random_char = random.choice([random_num, random_lower, random_upper])
return random_char

图片操作,生成一张随机背景色的图片,随机生成5种字符+5种颜色,在图片上描绘字,由于默认的字体很小,还需要对字进行处理,不同系统下的字体文件存放位置不一样,这里我是把window下的 arial.ttf 字体复制到了当前文件夹下直接使用的。

# 图片宽高
width = 160
height = 50 def createImg():
bg_color = getRandomColor()
# 创建一张随机背景色的图片
img = Image.new(mode="RGB", size=(width, height), color=bg_color)
# 获取图片画笔,用于描绘字
draw = ImageDraw.Draw(img)
# 修改字体
font = ImageFont.truetype(font="arial.ttf", size=36)
for i in range(5):
# 随机生成5种字符+5种颜色
random_txt = getRandomChar()
txt_color = getRandomColor()
# 避免文字颜色和背景色一致重合
while txt_color == bg_color:
txt_color = getRandomColor()
# 根据坐标填充文字
draw.text((10 + 30 * i, 3), text=random_txt, fill=txt_color, font=font)
# 打开图片操作,并保存在当前文件夹下
with open("test.png", "wb") as f:
img.save(f, format="png")

这个时候可以看到文件夹下面的图片

这里是张很清晰的图片,为了有干扰元素,这里还需要在图片加入些线条、点作为干扰点。

随机画线,在图片宽高范围内随机生成2个坐标点,并通过随机颜色产生线条。

def drawLine(draw):
for i in range(5):
x1 = random.randint(0, width)
x2 = random.randint(0, width)
y1 = random.randint(0, height)
y2 = random.randint(0, height)
draw.line((x1, y1, x2, y2), fill=getRandomColor())

随机画点,随机生成横纵坐标点。

def drawPoint(draw):
for i in range(50):
x = random.randint(0, width)
y = random.randint(0, height)
draw.point((x,y), fill=getRandomColor())

生成方法

def createImg():
bg_color = getRandomColor()
# 创建一张随机背景色的图片
img = Image.new(mode="RGB", size=(width, height), color=bg_color)
# 获取图片画笔,用于描绘字
draw = ImageDraw.Draw(img)
# 修改字体
font = ImageFont.truetype(font="arial.ttf", size=36)
for i in range(5):
# 随机生成5种字符+5种颜色
random_txt = getRandomChar()
txt_color = getRandomColor()
# 避免文字颜色和背景色一致重合
while txt_color == bg_color:
txt_color = getRandomColor()
# 根据坐标填充文字
draw.text((10 + 30 * i, 3), text=random_txt, fill=txt_color, font=font)
# 画干扰线点
drawLine(draw)
drawPoint(draw)
# 打开图片操作,并保存在当前文件夹下
with open("test.png", "wb") as f:
img.save(f, format="png")

最终生成的图片



这里介绍的是图片生成的方法,可以将图片直接显示在前端,也可以使用接口返回url。这里我简单的把图片做成链接显示在网页上,https://www.manjiexiang.cn/blog/validate 用Django做的,需要注意的是图片保存的路径。

欢迎关注我的个人博客:https://www.manjiexiang.cn/

更多精彩欢迎关注微信号:春风十里不如认识你

一起学习,一起进步,欢迎上车,有问题随时联系,一起解决!!!

python 生成图形验证码的更多相关文章

  1. 利用python生成图形验证码

    validCode.py import random from io import BytesIO from PIL import Image, ImageDraw, ImageFont def ge ...

  2. C#生成图形验证码

    先看效果: 再上代码 public class CaptchaHelper { private static Random rand = new Random(); private static in ...

  3. PHP5 GD库生成图形验证码(汉字)

    PHP5 GD库生成图形验证码且带有汉字的实例分享. 1,利用GD库函数生成图片,并在图片上写指定字符imagecreatetruecolor 新建一个真彩色图像imagecolorallocate ...

  4. PHP5生成图形验证码(有汉字)

    利用PHP5中GD库生成图形验证码 类似于下面这样 1.利用GD库函数生成图片,并在图片上写指定字符 imagecreatetruecolor   新建一个真彩色图像      imagecolora ...

  5. Python 生成随机验证码

    Python生成随机验证码  Python生成随机验证码,需要使用PIL模块. 安装: 1 pip3 install pillow 基本使用 1. 创建图片 1 2 3 4 5 6 7 8 9 fro ...

  6. Python生成随机验证码

    Python生成随机验证码,需要使用PIL模块. 安装: pip3 install pillow 基本使用 1.创建图片 from PIL import Image img = Image.new(m ...

  7. java生成图形验证码

    效果图 import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.Buf ...

  8. ASP.NET中如何生成图形验证码

    通常生成一个图形验证码主要 有3个步骤: (1)随机产生一个长度为N的随机字符串,N的值可由开发可由开发人员自行设置.该字符串可以包含数字.字母等. (2)将随机生成的字符串创建成图片,并显示. (3 ...

  9. python生成随机图形验证码

    使用python生成随机图片验证码,需要使用pillow模块 1.安装pillow模块 pip install pillow 2.pillow模块的基本使用 1.创建图片 from PIL impor ...

随机推荐

  1. Hive如何处理小文件问题?

    一.小文件是如何产生的 1.动态分区插入数据,产生大量的小文件,从而导致map数量剧增. 2.reduce数量越多,小文件也越多(reduce的个数和输出文件是对应的). 3.数据源本身就包含大量的小 ...

  2. MYSQL手册

    原文出处:http://www.cnblogs.com/gaofei-1/p/7152875.html MySQL配置文件 MySQL软件使用的配置文件名为my.ini,在安装目录下. MySQL常用 ...

  3. [Swift]LeetCode16. 最接近的三数之和 | 3Sum Closest

    Given an array nums of n integers and an integer target, find three integers in nums such that the s ...

  4. [Swift]LeetCode881. 救生艇 | Boats to Save People

    The i-th person has weight people[i], and each boat can carry a maximum weight of limit. Each boat c ...

  5. 微信小程序实战--集阅读与电影于一体的小程序项目(一)

    1.首页欢迎界面 项目目录结构 新建项目ReaderMovie,然后新建文件,结构如下 welcome.wxml <view class='container'> <image cl ...

  6. BBS论坛(二十六)

    26.发布帖子前台代码逻辑完成 (1)front/hooks.py from .views import bp from flask import session,g from .models imp ...

  7. 获取model的自定义特性

    class Program { static void Main(String[] args) { var t = typeof(A); var pName = t.GetProperty(" ...

  8. CentOS 7 安装 Jenkins

    准备工作 首选需要安装JAVA环境 https://www.cnblogs.com/stulzq/p/9286878.html 如果你的系统没有自带git,那么也需要安装一个 yum install ...

  9. 理解和使用Promise.all和Promise.race

    一.Pomise.all的使用 Promise.all可以将多个Promise实例包装成一个新的Promise实例.同时,成功和失败的返回值是不同的,成功的时候返回的是一个结果数组,而失败的时候则返回 ...

  10. Markdown 文档生成工具

    之前用了很多Markdown 文档生成工具,发现有几个挺好用的,现在整理出来,方便大家快速学习. loppo: 非常简单的静态站点生成器 idoc:简单的文档生成工具 gitbook:大名鼎鼎的文档协 ...