Python简单的制作图片验证码实例


Posted in Python onMay 31, 2017

这里示范的验证码都是简单的,你也可以把字符扭曲

Python简单的制作图片验证码实例

Python第三方库无比强大,PIL 是python的一个d第三方图片处理模块,我们也可以使用它来生成图片验证码

PIL安装

命令安装:

pip install pillow

下载源码安装:

复制地址 :https://github.com/python-pillow/Pillow

PIL使用

例子:生成图片,并填充文字

#!/usr/bin/python
#-*-coding:utf-8-*-
from PIL import Image, ImageDraw, ImageFont, ImageFilter
# 实例一个图片对象240 x 60:
width = 60 * 4
height = 60
# 图片颜色
clo = (43, 34, 88) # 我觉得是紫蓝色
image = Image.new('RGB', (width, height), clo)

# 创建Font对象:
# 字体文件可以使用操作系统的,也可以网上下载
font = ImageFont.truetype('./font/Arial.ttf', 36)

# 创建Draw对象:
draw = ImageDraw.Draw(image)

# 输出文字:
str1 = "ren ren Python"
w = 4 #距离图片左边距离
h = 10 #距离图片上边距离
draw.text((w, h), str1, font=font)
# 模糊:
image.filter(ImageFilter.BLUR)
code_name = 'test_code_img.jpg'
save_dir = './{}'.format(code_name)
image.save(save_dir, 'jpeg')
print("已保存图片: {}".format(save_dir))
(venv) allenwoo@~/renren/code$ python test2.py 
已保存图片: ./test_code_img.jpg

图片如下:

Python简单的制作图片验证码实例

文字没有什么色彩,我们也可以加上颜色,只需要在 text 中传人 fill 参数就好

draw.text((w, h), str1, font=font, fill = (78, 64, 65))

随便加的颜色

Python简单的制作图片验证码实例

我们还可以把背景弄成很多个小点,每隔n隔像素填充个其他颜色比如:

#!/usr/bin/python
#-*-coding:utf-8-*-
from PIL import Image, ImageDraw, ImageFont, ImageFilter
# 实例一个图片对象240 x 60:
width = 60 * 4
height = 60
# 图片颜色
clo = (43, 34, 88) # 我觉得是紫蓝色
image = Image.new('RGB', (width, height), clo)

# 创建Font对象:
# 字体文件可以使用操作系统的,也可以网上下载
font = ImageFont.truetype('./font/Arial.ttf', 36)

# 创建Draw对象:
draw = ImageDraw.Draw(image)

# 填充像素:
# 宽每隔 20, 高每隔5, 形成坐标x,y
# 红色:220,20,60
for x in range(0, width, 20):
  for y in range(0, height, 5):
    draw.point((x, y), fill=(220, 20, 60))

# 输出文字:
str1 = "we are renren"
w = 4 #距离图片左边距离
h = 10 #距离图片上边距离
draw.text((w, h), str1, font=font, fill = (78, 64, 65))
# 模糊:
image.filter(ImageFilter.BLUR)
code_name = 'test_code_img.jpg'
save_dir = './{}'.format(code_name)
image.save(save_dir, 'jpeg')
print("已保存图片: {}".format(save_dir))

结果图片:

Python简单的制作图片验证码实例

PIL制作验证码

利用以上这些,还有我们之前学习的随机生成器random就可以做个验证码了,

生成验证码代码

#!/usr/bin/python
#-*-coding:utf-8-*-
from uuid import uuid1
from PIL import Image, ImageDraw, ImageFont, ImageFilter
import random
def rnd_char():
  '''
  随机一个字母或者数字
  :return: 
  '''
  # 随机一个字母或者数字
  i = random.randint(1,3)
  if i == 1:
    # 随机个数字的十进制ASCII码
    an = random.randint(97, 122)
  elif i == 2:
    # 随机个小写字母的十进制ASCII码
    an = random.randint(65, 90)
  else:
    # 随机个大写字母的十进制ASCII码
    an = random.randint(48, 57)
  # 根据Ascii码转成字符,return回去
  return chr(an)

# 干扰
def rnd_dis():
  '''
  随机一个干扰字
  :return: 
  '''
  d = ['^','-', '~', '_', '.']
  i = random.randint(0, len(d)-1)
  return d[i]

# 两个随机颜色都规定不同的区域,防止干扰字符和验证码字符颜色一样
# 随机颜色1:
def rnd_color():
  '''
  随机颜色,规定一定范围
  :return: 
  '''
  return (random.randint(64, 255), random.randint(64, 255), random.randint(64, 255))

# 随机颜色2:
def rnd_color2():
  '''
   随机颜色,规定一定范围
   :return: 
   '''
  return (random.randint(32, 127), random.randint(32, 127), random.randint(32, 127))

def create_code():
  # 240 x 60:
  width = 60 * 4
  height = 60
  image = Image.new('RGB', (width, height), (192, 192, 192))
  # 创建Font对象:
  font = ImageFont.truetype('./font/Arial.ttf', 36)

  # 创建Draw对象:
  draw = ImageDraw.Draw(image)

  # 填充每个像素:
  for x in range(0, width, 20):
    for y in range(0, height, 10):
      draw.point((x, y), fill=rnd_color())

  # 填充字符
  _str = ""
  # 填入4个随机的数字或字母作为验证码
  for t in range(4):
    c = rnd_char()
    _str = "{}{}".format(_str, c)

    # 随机距离图片上边高度,但至少距离30像素
    h = random.randint(1, height-30)
    # 宽度的化,每个字符占图片宽度1/4,在加上10个像素空隙
    w = width/4 * t + 10
    draw.text((w, h), c, font=font, fill=rnd_color2())

  # 实际项目中,会将验证码 保存在数据库,并加上时间字段
  print("保存验证码 {} 到数据库".format(_str))

  # 给图片加上字符干扰,密集度由 w, h控制
  for j in range(0, width, 30):
    dis = rnd_dis()
    w = t * 15 + j

    # 随机距离图片上边高度,但至少距离30像素
    h = random.randint(1, height - 30)
    draw.text((w, h), dis, font=font, fill=rndColor())

  # 模糊:

  image.filter(ImageFilter.BLUR)

  # uuid1 生成唯一的字符串作为验证码图片名称
  code_name = '{}.jpg'.format(uuid1())
  save_dir = './{}'.format(code_name)
  image.save(save_dir, 'jpeg')
  print("已保存图片: {}".format(save_dir))

# 当直接运行文件的是和,运行下面代码
if __name__ == "__main__":
  create_code()
(venv) allenwoo@~/renren/code$ python test.py 
保存验证码 ef3k 到数据库
已保存图片: ./c86e03c0-1c23-11e7-999d-f45c89c09e61.jpg
(venv) allenwoo@~/renren/code$ python test.py 
保存验证码 I37X 到数据库
已保存图片: ./cb8aed02-1c23-11e7-9b18-f45c89c09e61.jpg
(venv) allenwoo@~/renren/code$ python test.py 
保存验证码 vVL1 到数据库
已保存图片: ./cc120da8-1c23-11e7-b762-f45c89c09e61.jpg
(venv) allenwoo@~/renren/code$ python test.py 
保存验证码 K6w3 到数据库
已保存图片: ./cc891e05-1c23-11e7-b7ec-f45c89c09e61.jpg

Python简单的制作图片验证码实例

Python简单的制作图片验证码实例

Python简单的制作图片验证码实例

Python简单的制作图片验证码实例

你觉得难不难呢?最后这个生成验证码代码中有些逻辑问题要理解下

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Django实现图片文字同时提交的方法
May 26 Python
Python模拟百度登录实例详解
Jan 20 Python
python中利用Future对象回调别的函数示例代码
Sep 07 Python
python 动态生成变量名以及动态获取变量的变量名方法
Jan 20 Python
python GUI实现小球满屏乱跑效果
May 09 Python
复化梯形求积分实例——用Python进行数值计算
Nov 20 Python
django 模型中的计算字段实例
May 19 Python
Django中ORM找出内容不为空的数据实例
May 20 Python
tensorflow使用L2 regularization正则化修正overfitting过拟合方式
May 22 Python
基于python实现matlab filter函数过程详解
Jun 08 Python
Python 代码调试技巧示例代码
Aug 11 Python
pytest配置文件pytest.ini的详细使用
Apr 17 Python
详解python的webrtc库实现语音端点检测
May 31 #Python
python实现决策树C4.5算法详解(在ID3基础上改进)
May 31 #Python
基于ID3决策树算法的实现(Python版)
May 31 #Python
Python基础知识_浅谈用户交互
May 31 #Python
python数据类型_字符串常用操作(详解)
May 30 #Python
python数据类型_元组、字典常用操作方法(介绍)
May 30 #Python
node.js获取参数的常用方法(总结)
May 29 #Python
You might like
全国FM电台频率大全 - 8 黑龙江省
2020/03/11 无线电
php 分页类 扩展代码
2009/06/11 PHP
php 图片上添加透明度渐变的效果
2009/06/29 PHP
PHP生成随机数的方法实例分析
2015/01/22 PHP
PHP中md5()函数的用法讲解
2019/03/30 PHP
详解phpstorm2020最新破解方法
2020/09/17 PHP
Javascript中正则表达式的全局匹配模式分析
2011/04/26 Javascript
jQuery用unbind方法去掉hover事件及其他方法介绍
2013/03/18 Javascript
javascript中的括号()用法小结
2014/04/14 Javascript
require简单实现单页应用程序(SPA)
2016/07/12 Javascript
AngularJS 使用ng-repeat报错 [ngRepeat:dupes]
2017/01/19 Javascript
初探JavaScript 面向对象(推荐)
2017/09/03 Javascript
axios的拦截请求与响应方法
2018/08/11 Javascript
vant(ZanUi)结合async-validator实现表单验证的方法
2018/12/06 Javascript
从vue源码看props的用法
2019/01/09 Javascript
2019 年编写现代 JavaScript 代码的5个小技巧(小结)
2019/01/15 Javascript
js常见遍历操作小结
2019/06/06 Javascript
vue分页器组件编写方法详解
2019/06/28 Javascript
浅析vue-router中params和query的区别
2019/12/24 Javascript
微信小程序订阅消息(java后端实现)开发
2020/06/01 Javascript
[42:20]Secret vs Liquid 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
Python实现发送QQ邮件的封装
2017/07/14 Python
python opencv之分水岭算法示例
2018/02/24 Python
基于Python+QT的gui程序开发实现
2020/07/03 Python
解决python运行效率不高的问题
2020/07/20 Python
python在地图上画比例的实例详解
2020/11/13 Python
CSS3哪些新特性值得称赞
2016/03/02 HTML / CSS
CSS3实现网站商品展示效果图
2020/01/18 HTML / CSS
基于HTML5+tracking.js实现刷脸支付功能
2020/04/16 HTML / CSS
面试自我介绍演讲稿
2014/04/29 职场文书
辅导员评语
2014/05/04 职场文书
小学生倡议书范文
2014/05/13 职场文书
话题作文之自信作文
2019/11/15 职场文书
Pytorch实现图像识别之数字识别(附详细注释)
2021/05/11 Python
浅谈pytorch中的dropout的概率p
2021/05/27 Python
python计算列表元素与乘积详情
2022/08/05 Python