python生成随机验证码(中文验证码)示例

时间:2022-07-28 05:41:58 


# -*- coding: utf-8 -*-
import Image,ImageDraw,ImageFont
import random
import math, string 

class RandomChar():
  """用于随机生成汉字"""
  @staticmethod
  def Unicode():
    val = random.randint(0x4E00, 0x9FBF)
    return unichr(val) 

  @staticmethod
  def GB2312():
    head = random.randint(0xB0, 0xCF)
    body = random.randint(0xA, 0xF)
    tail = random.randint(0, 0xF)
    val = ( head << 8 ) | (body << 4) | tail
    str = "%x" % val
    return str.decode('hex').decode('gb2312') 

class ImageChar():
  def __init__(self, fontColor = (0, 0, 0),
                     size = (100, 40),
                     fontPath = 'wqy.ttc',
                     bgColor = (255, 255, 255),
                     fontSize = 20):
    self.size = size
    self.fontPath = fontPath
    self.bgColor = bgColor
    self.fontSize = fontSize
    self.fontColor = fontColor
    self.font = ImageFont.truetype(self.fontPath, self.fontSize)
    self.image = Image.new('RGB', size, bgColor) 

  def rotate(self):
    self.image.rotate(random.randint(0, 30), expand=0) 

  def drawText(self, pos, txt, fill):
    draw = ImageDraw.Draw(self.image)
    draw.text(pos, txt, font=self.font, fill=fill)
    del draw 

  def randRGB(self):
    return (random.randint(0, 255),
           random.randint(0, 255),
           random.randint(0, 255)) 

  def randPoint(self):
    (width, height) = self.size
    return (random.randint(0, width), random.randint(0, height)) 

  def randLine(self, num):
    draw = ImageDraw.Draw(self.image)
    for i in range(0, num):
      draw.line([self.randPoint(), self.randPoint()], self.randRGB())
    del draw 

  def randChinese(self, num):
    gap = 5
    start = 0
    for i in range(0, num):
      char = RandomChar().GB2312()
      x = start + self.fontSize * i + random.randint(0, gap) + gap * i
      self.drawText((x, random.randint(-5, 5)), RandomChar().GB2312(), self.randRGB())
      self.rotate()
    self.randLine(18) 

  def save(self, path):
    self.image.save(path)

标签:python验证码
0
投稿

猜你喜欢

  • 在SQL触发器或存储过程中获取在程序登录的用户

    2012-01-29 18:01:32
  • Flume监听oracle表增量的步骤详解

    2023-07-20 00:39:32
  • 比较SQL Server约束和DML触发器

    2008-12-24 15:54:00
  • ASP.NET教程第二讲 ASP.NET学习

    2007-08-07 12:01:00
  • ASP分页和日期格式化为RFC822格式的办法

    2008-11-21 15:46:00
  • 点选TOP后并不是直接跳到页顶的,而是滚动上去

    2023-09-07 02:36:43
  • 流行WEB开发语言比较之ASP篇

    2007-12-23 17:23:00
  • 简述Python中的进程、线程、协程

    2021-04-07 11:19:02
  • 日式酒店电梯面板设计

    2008-06-08 13:23:00
  • 用JS实现渐变效果,兼容各款浏览器

    2008-09-13 19:10:00
  • 桌面中心(二)数据库写入

    2023-11-18 12:26:15
  • 基于php+mysql的期末作业小项目(学生信息管理系统)

    2023-06-13 00:39:34
  • SQL Server中ISNULL函数介绍

    2009-09-09 21:23:00
  • 胜过语言的图形符号

    2009-05-06 12:43:00
  • 将数据从MySQL迁移到 Oracle的注意事项

    2008-12-03 15:41:00
  • Search File Contents PHP 搜索目录文本内容的代码

    2023-11-24 08:09:40
  • 详解go语言中sort如何排序

    2023-09-03 14:00:38
  • 网址站的2.0玩法

    2010-03-15 12:25:00
  • asp如何遍历Cookies集合?

    2009-11-08 19:07:00
  • 带你深入了解SQL Server 2008的独到之处

    2009-01-07 14:20:00
  • asp之家 网络编程 m.aspxhome.com