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 相关文章推荐
初步介绍Python中的pydoc模块和distutils模块
Apr 13 Python
利用Python的Django框架生成PDF文件的教程
Jul 22 Python
Django Admin实现上传图片校验功能
Mar 06 Python
详解Python3操作Mongodb简明易懂教程
May 25 Python
python 读取txt,json和hdf5文件的实例
Jun 05 Python
Pycharm导入Python包,模块的图文教程
Jun 13 Python
pandas 选择某几列的方法
Jul 03 Python
Python 点击指定位置验证码破解的实现代码
Sep 11 Python
Tensorflow 定义变量,函数,数值计算等名字的更新方式
Feb 10 Python
python实现KNN近邻算法
Dec 30 Python
健身房被搭讪?用python写了个小米计时器助人为乐
Jun 08 Python
如何通过一篇文章了解Python中的生成器
Apr 02 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
PHP中使用strpos函数实现屏蔽敏感关键字功能
2014/08/21 PHP
thinkphp模板的包含与渲染实例分析
2014/11/26 PHP
PHP遍历目录文件的常用方法小结
2017/02/03 PHP
jQuery+PHP实现图片上传并提交功能
2020/07/27 PHP
javascript判断用户浏览器插件安装情况的代码
2011/01/01 Javascript
基于JQuery 的消息提示框效果代码
2011/07/31 Javascript
FireBug 调试JS入门教程 如何调试JS
2013/12/23 Javascript
javascript引用赋值(地址传值)用法实例
2015/01/13 Javascript
JavaScript希尔排序、快速排序、归并排序算法
2016/05/08 Javascript
使用JavaScript实现ajax的实例代码
2016/05/11 Javascript
javaScript给元素添加多个class的简单实现
2016/07/20 Javascript
JavaScript实现的select点菜功能示例
2017/01/16 Javascript
详解React 16 中的异常处理
2017/07/28 Javascript
使用JS编写的随机抽取号码的小程序
2017/08/11 Javascript
DVA框架统一处理所有页面的loading状态
2017/08/25 Javascript
vue中过滤器filter的讲解
2019/01/21 Javascript
JavaScript实现拖拽盒子效果
2020/02/06 Javascript
[06:24]DOTA2 2015国际邀请赛中国区预选赛第二日TOP10
2015/05/27 DOTA
Python实现登录人人网并抓取新鲜事的方法
2015/05/11 Python
用python3教你任意Html主内容提取功能
2018/11/05 Python
python 列表转为字典的两个小方法(小结)
2019/06/28 Python
python sqlite的Row对象操作示例
2019/09/11 Python
简单了解python字符串前面加r,u的含义
2019/12/26 Python
Python脚本导出为exe程序的方法
2020/03/25 Python
Python日志logging模块功能与用法详解
2020/04/09 Python
Python解析微信dat文件的方法
2020/11/30 Python
荷兰网上鞋店:Ziengs.nl
2017/01/02 全球购物
临床医师专业个人自我评价
2014/01/08 职场文书
大学生秋游活动方案
2014/02/17 职场文书
小区消防演习方案
2014/02/21 职场文书
小学英语教师先进事迹
2014/05/28 职场文书
教师四风对照检查材料思想汇报
2014/09/17 职场文书
家长学校教学计划
2015/01/19 职场文书
个人优缺点总结
2015/02/28 职场文书
通知书大全
2015/04/27 职场文书
Java线程的6种状态与生命周期
2022/05/11 Java/Android