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中的闭包比较
Feb 04 Python
python获取程序执行文件路径的方法(推荐)
Apr 26 Python
对python-3-print重定向输出的几种方法总结
May 11 Python
Python读取txt内容写入xls格式excel中的方法
Oct 11 Python
Python高级特性 切片 迭代解析
Aug 23 Python
python序列化与数据持久化实例详解
Dec 20 Python
使用TensorFlow对图像进行随机旋转的实现示例
Jan 20 Python
Python实现遗传算法(二进制编码)求函数最优值方式
Feb 11 Python
jupyter notebook 的工作空间设置操作
Apr 20 Python
python3.6.5基于kerberos认证的hive和hdfs连接调用方式
Jun 06 Python
关于Python 解决Python3.9 pandas.read_excel(‘xxx.xlsx‘)报错的问题
Nov 28 Python
关于Python OS模块常用文件/目录函数详解
Jul 01 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递归调用的小技巧讲解
2013/02/19 PHP
解析mysql中UNIX_TIMESTAMP()函数与php中time()函数的区别
2013/06/24 PHP
php中多维数组按指定value排序的实现代码
2014/08/19 PHP
laravel多条件查询方法(and,or嵌套查询)
2019/10/09 PHP
JavaScript性能优化 创建文档碎片(document.createDocumentFragment)
2010/07/13 Javascript
js用Date对象处理时间实现思路及代码
2013/01/31 Javascript
判定是否原生方法的JS代码
2013/11/12 Javascript
微信小程序 地图map详解及简单实例
2017/01/10 Javascript
Angular2使用Angular CLI快速搭建工程(一)
2017/05/21 Javascript
详解vue.js的事件处理器v-on:click
2017/06/27 Javascript
vue-cli 打包使用history模式的后端配置实例
2018/09/20 Javascript
LayUi使用switch开关,动态的去控制它是否被启用的方法
2019/09/21 Javascript
javascript实现贪吃蛇小练习
2020/07/05 Javascript
[50:59]2018DOTA2亚洲邀请赛 4.7 总决赛 LGD vs Mineski第四场
2018/04/10 DOTA
学习python (2)
2006/10/31 Python
Python如何判断数独是否合法
2016/09/08 Python
浅谈python socket函数中,send与sendall的区别与使用方法
2017/05/09 Python
使用XML库的方式,实现RPC通信的方法(推荐)
2017/06/14 Python
浅谈python 线程池threadpool之实现
2017/11/17 Python
python TCP Socket的粘包和分包的处理详解
2018/02/09 Python
pandas object格式转float64格式的方法
2018/04/10 Python
python 用下标截取字符串的实例
2018/12/25 Python
Python 面向对象之封装、继承、多态操作实例分析
2019/11/21 Python
Lancome兰蔻官方旗舰店:来自法国的世界知名美妆品牌
2018/06/14 全球购物
澳大利亚一站式数码相机商店:CameraPro
2020/03/09 全球购物
牵手50新加坡:专为黄金岁月的单身人士而设的交友网站
2020/08/16 全球购物
俄罗斯外国汽车和国产汽车配件网上商店:Движком
2020/04/19 全球购物
CAD制图人员的自荐信
2014/02/07 职场文书
房屋买卖协议书
2014/04/10 职场文书
节约用水的口号
2014/06/20 职场文书
群众路线教育实践活动学习心得体会
2014/10/30 职场文书
企业2014年度工作总结
2014/12/10 职场文书
2015年推广普通话演讲稿
2015/03/20 职场文书
卫生院义诊活动总结
2015/05/07 职场文书
一个独生女的故事观后感
2015/06/04 职场文书
2016年全国爱牙日宣传活动总结
2016/04/05 职场文书