from PIL import Image

from PIL import ImageDraw

from PIL import ImageFont

from io import BytesIO

import random

class ValidCodeImg:

"""

生成一个经过降噪后的随机验证码的图片

:return 生成图片的bytes类型的数据

"""

def __init__(self, width=175, height=35, code_count=5,

font_size=32, point_count=10, line_count=3,

img_format='png'):

# width: 图片宽度 单位px

self.width = width

# height: 图片高度 单位px

self.height = height

# code_count: 验证码个数

self.code_count = code_count

# font_size: 字体大小

self.font_size = font_size

# point_count: 噪点个数

self.point_count = point_count

# line_count: 划线个数

self.line_count = line_count

# img_format: 图片格式

self.img_format = img_format

@staticmethod

def getrandomcolor():

"""获取一个随机颜色-(r,g,b)格式"""

cor_r = random.randint(0, 255)

cor_g = random.randint(0, 255)

cor_b = random.randint(0, 255)

return cor_r, cor_g, cor_b

@staticmethod

def getrandomstr():

"""获取一个随机字符串"""

# 获取一个0-9的随机书

num_str = str(random.randint(0, 9))

# 获取一个A-Z的随机大写字母,65-90是大写字母的ascii码,通过chr转换成对应的字符

upper_str = chr(random.randint(65, 90))

# 获取一个a-z的随机小写字母,97-122是小写的ascii码,通过chr转换成对应的字符

lower_str = chr(random.randint(97, 122))

# 通过random模块的choice方法随机从以上的随机数字,大写字母和小写字母中获取一个字符,并返回

random_str = random.choice((num_str, upper_str, lower_str))

return random_str

def getvalidcodeimg(self):

"""获取一个随机验证码图片"""

# 通过Image.new(rgb格式, (图片的宽,图片的高), 颜色)获取一个Image对象

img_obj = Image.new('RGB', (self.width, self.height), self.getrandomcolor())

print(img_obj)

# 通过ImageDraw.Draw(Image对象)获取一个画笔对象

draw = ImageDraw.Draw(img_obj)

# 通过ImageFont.truetype(字体文件路径, 字体大小)获取一个字体对象

font = ImageFont.truetype(r'\static\font\STXINGKA.TTF', size=self.font_size)

tmp_list = [] # 用于存储随机字符串

for i in range(self.code_count):

random_char = self.getrandomstr()

# 在图片上写入得到的随机字符串,这样字符之间才会有距离,不会叠加

# 通过画笔对象的text方法,即 draw.text((x, y), 字符串, 颜色, 字体)

draw.text((10 + i * 32, -2), random_char, self.getrandomcolor(), font=font)

# 将随机字符串保存

tmp_list.append(random_char)

# 将所有的字符串拼接,稍后返回,用于校验用户录入的记录是否正确

valid_str = ''.join(tmp_list)

# 噪线的生成

for i in range(self.line_count):

# 噪线的起点横坐标和纵坐标

x1 = random.randint(0, self.width)

y1 = random.randint(0, self.height)

# 噪线的终点横坐标和纵坐标

x2 = random.randint(0, self.width)

y2 = random.randint(0, self.height)

# 通过画笔对象draw.line((起点的xy, 终点的xy), fill='颜色')来划线

draw.line((x1, y1, x2, y2), fill=self.getrandomcolor())

# 噪点的生成

for i in range(self.point_count):

draw.point([random.randint(0, self.width), random.randint(0, self.height)], fill=self.getrandomcolor())

x = random.randint(0, self.width)

y = random.randint(0, self.height)

draw.arc((x, y, x + 4, y + 4), 0, 40, fill=self.getrandomcolor())

# 将生成的图片保存到内存中

f = BytesIO()

img_obj.save(f, self.img_format)

data = f.getvalue()

f.close()

return data, valid_str

# # 测试

# if __name__ == '__main__':

# img = ValidCodeImg()

#

# data, valid_str = img.getvalidcodeimg()

# print(valid_str)

#

# with open(r'E:\Desktop\code_test.png', 'wb') as f:

# f.write(data)

python圆形噪点_python模块PIL-获取带噪点噪线的随机验证码相关推荐

  1. python查看图片颜色统计_Python通过PIL获取图片主要颜色并和颜色库进行对比的方法...

    本文实例讲述了Python通过PIL获取图片主要颜色并和颜色库进行对比的方法.分享给大家供大家参考.具体分析如下: 这段代码主要用来从图片提取其主要颜色,类似Goolge和Baidu的图片搜索时可以指 ...

  2. python ascii函数二进制_python模块介绍- binascii:二进制和ASCII互转以及其他进制转换...

    20.1 binascii:二进制和ASCII互转 作用:二进制和ASCII互相转换. Python版本:1.5及以后版本 binascii模块包含很多在二进制和ASCII编码的二进制表示转换的方法. ...

  3. python 苹果李子橙_Python模块知识6:OS、SYS模块

    1.os模块,和系统相关的,比如获取路径.目录.文件夹之类 常用方法: os.getcwd() #获取当前工作目录,即当前Python脚本工作的目录路径 os.rename('oldname','ne ...

  4. python怎么定义名称_Python模块的定义,模块的导入,__name__用法实例分析

    本文实例讲述了Python模块的定义,模块的导入,__name__用法.分享给大家供大家参考,具体如下: 相关内容: 什么是模块 模块的导入 模块的导入 自模块的导入 同级目录导入 不同级目录导入 目 ...

  5. python 阮一峰_Python模块整理

    这两天学习了一些基本的Python模块,现在做一些整理,理清楚 查看大佬的理解:http://www.cnblogs.com/alex3714/articles/5161349.html 开始时间:1 ...

  6. python微秒级别等待_python时间操作—获取微秒级别的时间差

    python中有两个模块可以完成时间操作:time和datetime(相比较datetime更强大) 以下分别是两个模块的具体信息: >>> dir(time) ['_STRUCT_ ...

  7. python 处理url 参数_python模块 furl 使得操纵URL简单化,去除网址中参数

    介绍: furl是一个小型Python库,可以轻松解析和操作URL. Python的标准urllib和 urlparse模块提供了许多与URL 相关的功能,但使用这些函数执行常见的URL 操作非常麻烦 ...

  8. python mac地址转换_Python MAC地址 获取,过滤,转换 Python MYSQL 数据获取,比较

    [输出MAC 地址][root@pc0003 glpi_switch_ocs]# cat huawei #!/usr/bin/expect -f set ip 192.168.AC.IP set pa ...

  9. python爬虫抓取文本_Python实现可获取网易页面所有文本信息的网易网络爬虫功能示例...

    本文实例讲述了Python实现可获取网易页面所有文本信息的网易网络爬虫功能.分享给大家供大家参考,具体如下: #coding=utf-8 #------------------------------ ...

最新文章

  1. Python学习札记(六)
  2. 安装开源项目 MultiType (基于 RecyclerView)出现的各种问题 -- 自己的第一篇博客...
  3. 二叉树的最长的路径长度最大路径和
  4. The Distinguish of the share or static lib in MFC
  5. ENS与Cloudflare合作推出改进的ETH.LINK服务
  6. C# 后台服务器端 Get 请求函数封装
  7. 东秦数模美赛校赛记录——紧急车辆位置.题目
  8. 使用SSH公钥登录服务器
  9. Qt程序的国际化支持【收藏】
  10. 多多情报通:拼多多推广哪个效果好?有什么推广技巧?
  11. Adobe illustrator安装
  12. 关于一张出库单开具了多张发票的错误处理
  13. 数据库+jdbc实现学生教师管理
  14. 微信android自动播放视频文件,vue-player或TcPlayer在微信内自动播放video和audio
  15. 临沧黄衣阿佤-中国佤民族中一支穿黄色衣服的佤族群体
  16. 引才!博士60万、硕士35万、本科28万,沿海城市
  17. 1015-计算并联电阻的阻值
  18. ORACLE 参数 O7_DICTIONARY_ACCESSIBILITY
  19. 开源代码01:眼力大挑战
  20. java for二重循环_java什么是二重循环

热门文章

  1. 【每日面试】东方财富二面 Java
  2. “星河杯”隐私计算大赛-赛题Baseline来啦
  3. 【理论 | 代码】机器学习分类与回归性能评估指标大全
  4. 浙江理工2015.12校赛-A
  5. 11.11真打折:员工集体“骨折装”上阵 奥康火力全开
  6. 奇思妙想的概念设计(2)
  7. 什么样的QMS系统,才能让企业有节拍、高质量地生产?
  8. nginx配置url转发
  9. Eclipse快捷键耍帅大全
  10. 搞懂时钟管理,看这个就好啦~