python生成验证码图片代码分享

作者:lxydo 时间:2021-08-24 11:52:14 

本文实例为大家分享了python生成验证码图片代码,分享给大家供大家参考,具体内容如下

基本上大家使用每一种网络服务都会遇到验证码,一般是网站为了防止恶意注册、发帖而设置的验证手段。其生成原理是将一串随机产生的数字或符号,生成一幅图片,图片里加上一些干扰象素(防止OCR)。下面就详细讲解如何生成验证码。

所需环境

除了配置好的python环境外,还需要配有python中的PIL库,这是python中专门用来处理图片的库。用传统的pip install 方法或者下载源码 python setup.py install 方法安装该库,很可能会报错(视运行环境不同)。可以采用下面这个方法

  • 1.下载安装包URL,要下载支持全平台的。
     

  • 2.解压缩: tar –zxv –f Imaging-1.1.7.tar.gz
     

  • 3.进入到解压后的目录: cd Imaging-1.1.7
     

  • 4.Bulid pakage:python setup.py build_ext –i
     

  • 5.测试:python selftest.py
     

  • 6.安装:python setup.py install

代码实现

要生成验证码图片,我们首先要生成一个随机字符串,包含26个字母和10个数字。


#用来随机生成一个字符串
def gene_text():
source = list(string.letters)
for index in range(0,10):
 source.append(str(index))
return ''.join(random.sample(source,number))#number是生成验证码的位数

然后我们要创建一个图片,写入字符串,需要说明的这里面的字体是不同系统而定,如果没有找到系统字体路径的话,也可以不设置


def gene_code():
width,height = size #宽和高
image = Image.new('RGBA',(width,height),bgcolor) #创建图片
font = ImageFont.truetype(font_path,25) #验证码的字体和字体大小
draw = ImageDraw.Draw(image) #创建画笔
text = gene_text() #生成字符串
font_width, font_height = font.getsize(text)
draw.text(((width - font_width) / number, (height - font_height) / number),text,\
  font= font,fill=fontcolor) #填充字符串

接下来,我们要在图片上画几条干扰线


#用来绘制干扰线
def gene_line(draw,width,height):
begin = (random.randint(0, width), random.randint(0, height))
end = (random.randint(0, width), random.randint(0, height))
draw.line([begin, end], fill = linecolor)

最后创建扭曲,加上滤镜,用来增强验证码的效果。


image = image.transform((width+20,height+10), Image.AFFINE, (1,-0.3,0,-0.1,1,0),Image.BILINEAR) #创建扭曲
image = image.filter(ImageFilter.EDGE_ENHANCE_MORE) #滤镜,边界加强
image.save('idencode.png') #保存验证码图片

下面是用上述程序生成的一个验证码

python生成验证码图片代码分享

下面是完整的代码:


#coding=utf-8
import random
import string
import sys
import math
from PIL import Image,ImageDraw,ImageFont,ImageFilter

#字体的位置,不同版本的系统会有不同
font_path = '/Library/Fonts/Arial.ttf'
#生成几位数的验证码
number = 4
#生成验证码图片的高度和宽度
size = (100,30)
#背景颜色,默认为白色
bgcolor = (255,255,255)
#字体颜色,默认为蓝色
fontcolor = (0,0,255)
#干扰线颜色。默认为红色
linecolor = (255,0,0)
#是否要加入干扰线
draw_line = True
#加入干扰线条数的上下限
line_number = (1,5)

#用来随机生成一个字符串
def gene_text():
source = list(string.letters)
for index in range(0,10):
 source.append(str(index))
return ''.join(random.sample(source,number))#number是生成验证码的位数
#用来绘制干扰线
def gene_line(draw,width,height):
begin = (random.randint(0, width), random.randint(0, height))
end = (random.randint(0, width), random.randint(0, height))
draw.line([begin, end], fill = linecolor)

#生成验证码
def gene_code():
width,height = size #宽和高
image = Image.new('RGBA',(width,height),bgcolor) #创建图片
font = ImageFont.truetype(font_path,25) #验证码的字体
draw = ImageDraw.Draw(image) #创建画笔
text = gene_text() #生成字符串
font_width, font_height = font.getsize(text)
draw.text(((width - font_width) / number, (height - font_height) / number),text,\
  font= font,fill=fontcolor) #填充字符串
if draw_line:
 gene_line(draw,width,height)
# image = image.transform((width+30,height+10), Image.AFFINE, (1,-0.3,0,-0.1,1,0),Image.BILINEAR) #创建扭曲
image = image.transform((width+20,height+10), Image.AFFINE, (1,-0.3,0,-0.1,1,0),Image.BILINEAR) #创建扭曲
image = image.filter(ImageFilter.EDGE_ENHANCE_MORE) #滤镜,边界加强
image.save('idencode.png') #保存验证码图片
if __name__ == "__main__":
gene_code()
标签:python,验证码
0
投稿

猜你喜欢

  • python神经网络InceptionV3模型复现详解

    2021-05-29 16:53:01
  • mysql容器之间的replication配置实例详解

    2024-01-17 23:48:01
  • 从ThinkPHP3.2.3过渡到ThinkPHP5.0学习笔记图文详解

    2023-09-04 10:21:28
  • Python基于os.environ从windows获取环境变量

    2022-09-18 01:42:45
  • golang 实现interface{}转其他类型操作

    2024-05-09 09:31:23
  • 关于Python的高级数据结构与算法

    2023-12-22 00:29:40
  • Scrapy之迭代爬取网页中失效问题及解决

    2022-11-02 21:03:32
  • Oracle数据库逻辑备份的SH文件

    2010-07-27 13:26:00
  • 教你怎么用PyCharm为同一服务器配置多个python解释器

    2022-01-29 10:22:21
  • PHP/ThinkPHP实现批量打包下载文件的方法示例

    2024-05-11 09:49:00
  • Python编程实现简单的微博自动点赞

    2021-05-14 06:43:12
  • DIV+CSS高度自适应网页代码实例

    2008-09-20 08:00:00
  • Ubuntu16.04安装python3.6.5步骤详解

    2023-01-01 08:06:58
  • Selenium爬取b站主播头像并以昵称命名保存到本地

    2023-05-18 01:26:36
  • PHP获取二叉树镜像的方法

    2023-07-13 02:57:39
  • bootstrapValidator表单验证插件学习

    2024-04-10 13:53:34
  • Python中集合的内建函数和内建方法学习教程

    2023-11-03 04:11:27
  • Django 中的Timezone 处理操作

    2022-01-08 10:23:20
  • MySQL单表查询常见操作实例总结

    2024-01-20 05:47:17
  • mysql报错:MySQL server version for the right syntax to use near type=InnoDB的解决方法

    2024-01-20 19:17:17
  • asp之家 网络编程 m.aspxhome.com