Maison  >  Article  >  développement back-end  >  Un exemple simple de comment créer un code de vérification d'image en Python

Un exemple simple de comment créer un code de vérification d'image en Python

黄舟
黄舟original
2017-06-04 10:21:081447parcourir

Cet article présente principalement des exemples de Python production simple de imagescode de vérification, qui ont une certaine valeur de référence. Les amis intéressés peuvent s'y référer

<.>Les codes de vérification démontrés ici sont tous simples, vous pouvez également tordre les caractères


La bibliothèque tierce Python est extrêmement puissante, PIL est une bibliothèque tierce- module de traitement d'image de fête pour Python, nous pouvons également l'utiliser pour générer des codes de vérification d'image


PIL

Installation

Installation de la commande :

pip install pillow
Exemple : Générez une image et remplissez-la de texte

#!/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(&#39;RGB&#39;, (width, height), clo)

# 创建Font对象:
# 字体文件可以使用操作系统的,也可以网上下载
font = ImageFont.truetype(&#39;./font/Arial.ttf&#39;, 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 = &#39;test_code_img.jpg&#39;
save_dir = &#39;./{}&#39;.format(code_name)
image.save(save_dir, &#39;jpeg&#39;)
print("已保存图片: {}".format(save_dir))
(venv) allenwoo@~/renren/code$ python test2.py 
已保存图片: ./test_code_img.jpg
L'image est la suivante :

Le texte n'a pas de couleur, nous pouvons également ajouter des couleurs, passez simplement le paramètre de remplissage dans le texte

draw.text((w, h), str1, font=font, fill = (78, 64, 65))
Ajoutez la couleur que vous voulez


Nous pouvons également créer de nombreux petits points sur l'arrière-plan et remplir tous les n pixels avec d'autres couleurs, telles que :

#!/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(&#39;RGB&#39;, (width, height), clo)

# 创建Font对象:
# 字体文件可以使用操作系统的,也可以网上下载
font = ImageFont.truetype(&#39;./font/Arial.ttf&#39;, 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 = &#39;test_code_img.jpg&#39;
save_dir = &#39;./{}&#39;.format(code_name)
image.save(save_dir, &#39;jpeg&#39;)
print("已保存图片: {}".format(save_dir))
Image du résultat :


PIL crée un code de vérification

En utilisant ce qui précède et le

générateur aléatoirealéatoire que nous avons appris auparavant, vous pouvez créer un code de vérification,

Générer un code de vérification

#!/usr/bin/python
#-*-coding:utf-8-*-
from uuid import uuid1
from PIL import Image, ImageDraw, ImageFont, ImageFilter
import random
def rnd_char():
  &#39;&#39;&#39;
  随机一个字母或者数字
  :return: 
  &#39;&#39;&#39;
  # 随机一个字母或者数字
  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():
  &#39;&#39;&#39;
  随机一个干扰字
  :return: 
  &#39;&#39;&#39;
  d = [&#39;^&#39;,&#39;-&#39;, &#39;~&#39;, &#39;_&#39;, &#39;.&#39;]
  i = random.randint(0, len(d)-1)
  return d[i]

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

# 随机颜色2:
def rnd_color2():
  &#39;&#39;&#39;
   随机颜色,规定一定范围
   :return: 
   &#39;&#39;&#39;
  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(&#39;RGB&#39;, (width, height), (192, 192, 192))
  # 创建Font对象:
  font = ImageFont.truetype(&#39;./font/Arial.ttf&#39;, 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 = &#39;{}.jpg&#39;.format(uuid1())
  save_dir = &#39;./{}&#39;.format(code_name)
  image.save(save_dir, &#39;jpeg&#39;)
  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




Vous trouvez cela difficile ? Enfin, il y a quelques problèmes logiques dans ce code de génération de code de vérification qui doivent être compris

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn