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 转换 Javascript %u 字符串为python unicode的代码
Sep 06 Python
Python selenium如何设置等待时间
Sep 15 Python
python实现在IDLE中输入多行的方法
Apr 19 Python
Python处理中文标点符号大集合
May 14 Python
python频繁写入文件时提速的方法
Jun 26 Python
numpy.meshgrid()理解(小结)
Aug 01 Python
pycharm编写spark程序,导入pyspark包的3中实现方法
Aug 02 Python
Django中reverse反转并且传递参数的方法
Aug 06 Python
Pyorch之numpy与torch之间相互转换方式
Dec 31 Python
python生成大写32位uuid代码
Mar 03 Python
Python 面向对象静态方法、类方法、属性方法知识点小结
Mar 09 Python
Python如何自动获取目标网站最新通知
Jun 18 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编码规范-php coding standard
2007/03/16 PHP
PHP 递归效率分析
2009/11/24 PHP
zend framework文件上传功能实例代码
2013/12/25 PHP
ThinkPHP3.1新特性之多数据库操作更加完善
2014/06/19 PHP
php商品对比功能代码分享
2015/09/24 PHP
PHP简单判断字符串是否包含另一个字符串的方法
2016/03/25 PHP
JavaScript ECMA-262-3 深入解析.第三章.this
2011/09/28 Javascript
jquery配合css简单实现返回顶部效果
2013/09/30 Javascript
jquery获取颜色在ie和ff下的区别示例介绍
2014/03/28 Javascript
js检测浏览器版本、核心、是否移动端示例
2014/04/24 Javascript
基于NodeJS的前后端分离的思考与实践(二)模版探索
2014/09/26 NodeJs
AngularJS语法详解
2015/01/23 Javascript
js中flexible.js实现淘宝弹性布局方案
2020/06/23 Javascript
Mongoose学习全面理解(推荐)
2017/01/21 Javascript
JS完成画圆圈的小球
2017/03/07 Javascript
nodejs学习笔记之路由
2017/03/27 NodeJs
JS 组件系列之 bootstrap treegrid 组件封装过程
2017/04/28 Javascript
JavaScript文件的同步和异步加载的实现代码
2017/08/19 Javascript
详解Vue打包优化之code spliting
2018/04/09 Javascript
JavaScript求一个数组中重复出现次数最多的元素及其下标位置示例
2018/07/23 Javascript
node.js微信小程序配置消息推送的实现
2019/02/13 Javascript
搭建一个Koa后端项目脚手架的方法步骤
2019/05/30 Javascript
[46:04]Liquid vs VP Supermajor决赛 BO 第四场 6.10
2018/07/05 DOTA
由Python运算π的值深入Python中科学计算的实现
2015/04/17 Python
python 读写中文json的实例详解
2017/10/29 Python
Python内置类型性能分析过程实例
2020/01/29 Python
CSS3动画和HTML5新特性详解
2020/08/31 HTML / CSS
德国综合购物网站:OTTO
2018/11/13 全球购物
中专毕业生自荐信范文
2013/11/28 职场文书
办公室岗位职责
2014/02/12 职场文书
2014年元旦感言
2014/03/06 职场文书
群众路线剖析材料怎么写
2014/10/09 职场文书
小学优秀教师材料
2014/12/15 职场文书
感恩主题班会教案
2015/08/12 职场文书
导游词之潮音寺
2019/09/26 职场文书
《天使的翅膀》读后感3篇
2019/12/20 职场文书