python 生成验证码

原文地址:python 生成验证码 作者:1吏
刚才从网上抄了一个python生成验证码的程序。原文地址:
http://www.pyfun.com/shenru/201008/841_2.html

在使用的时候,发现其中一条代码报错:
self.font = core.getfont(file, size, index, encoding) IOError: cannot open r
从网上搜索得知是不同的操作系统,字体位置不同导致的。
如: https://gist.github.com/835062
在ubuntu 10.04下,
1,
设置这么一个变量:
FONT_PATH = "/usr/share/fonts/truetype/freefont/FreeSans.ttf"
2,
并把原链接的代码中:
  self.font = ImageFont.truetype(self.fonttype, self.fontsize)
替换为:
  self.font = ImageFont.truetype(FONT_PATH, self.fontsize)

3,
修改后的完整代码如下:


#!/usr/bin/env python
#coding:utf-8

import Image
import ImageDraw
import ImageFont
import os
import string
import random
import ImageFilter

#这个要根据实际系统进行修改
FONT_PATH = "/usr/share/fonts/truetype/freefont/FreeSans.ttf"

def initChars():
      """
      允许的字符集合,初始集合为数字、大小写字母
      usage: initChars()
      param: None
      return: list
      返回允许的字符集和
      for: picChecker类初始字符集合
      todo: Nothi
      """
      nums = [str(i) for i in range(10)]
      letter = "abcdefghijklmnopqrstuvwx yz"
      lowerCase = [x for x in letter]
      upperCase = [x.upper() for x in lowerCase]
      return (nums + lowerCase + upperCase)

class picChecker():
      """
      图片验证代码:
      1) 用户注册需填写图片验证码,以阻止机器人注册
      2) 图片验证码字符数为 4 位(大小写字母与数字,不区分大小写)。
      用户如果没有填写验证码或没有填写正确的验证码,
      页面友好性提示用户填写(同时程序方面也做相应限制)
      usage: pc = picChecker().createChecker()
      param: 很多,如下
      chars 允许的字符集合,
      类型 list
      默认值 initChars()
      例子 ['1','2','3']
      length 字符串长度
      类型 integer
      默认值 4
      size 图片大小
      类型 tutle
      默认值 (120,30)
      例子 (120,30)
      fontsize 字体大小
      类型 integer
      默认值 25
      begin 字符其实位置,即左上角位置
      类型 tutle
      默认值 (5,-2)
      outputType 输出类型
      类型 string
      默认值 GIF
      可选值 GIF JPEG TIFF PNG
      mode 图片模式
      类型 string
      可选值 RGB L (还有其他模式,但只推荐这2种)
      默认值 RGB
      backgroundColor 背景色
      foregroundColor 前景色
      当mode=RGB时,backgroundColor,foregroundColor为tutle类型
      取值为(integer,integer,integer)
      表示RGB颜色值
      当mode=L时,backgroundColor,foregroundColor为数字,表示黑白模式
      取值为0-255
      表示灰度
      fonttype 字体路径
      类型 string
      默认值 "simsum.ttc"
      jamNum 干扰线条数
      类型 (int1,int1)
      int1 干扰线条数下限,包含
      int2 干扰线条数上线,包含
      pointBorder 散点噪音
      构造方法:对每个像素点使用随机函数确定是否在该像素上画散点噪音
      类型 (int1,int2)
      int1越大 散点越多
      int2越大 散点越少
      return: [picCheckerStr,pic]
      picCheckerStr: 表示返回图片中对应的字符串,可用于session验证以及其他用途
      pic : 返回的图片,类型为Image
      for :
      todo : Nothing
      """
      def __init__(self, chars = initChars(),
                      size = (120, 30), fontsize = 25,
                      begin = (5, -2), outputType = 'GIF',
                      mode = 'RGB', backgroundColor = (255, 255, 255),
                      foregroundColor = (0, 0, 255),
                      fonttype = "simsun.ttc", length = 4, jamNum = (1, 2),
                      pointBorder = (40, 39)
                      ):
              self.chars = chars
              self.size = size
              self.begin = begin
              self.length = length
              self.outputType = outputType
              self.fontsize = fontsize
              self.mode = mode
              self.backgroundColor = backgroundColor
              self.foregroundColor = foregroundColor
              self.jamNum = jamNum
              self.pointBorder = pointBorder
              self.fonttype = fonttype
              #self.font = ImageFont.truetype(self.fonttype, self.fontsize)
              self.font = ImageFont.truetype(FONT_PATH, self.fontsize)


      def createPoints(self, draw):
              """
              usage: 创建散点噪音
              para: draw 表示画笔
              return: None
              for:
              todo:
              """
              for x in range(self.size[0]):
                      for y in range(self.size[1]):
                              flag = random.randint(0, self.pointBorder[0])
                              if flag > self.pointBorder[1]:
                                      draw.point((x, y), fill = (0, 0, 0))
                              del flag

      def createJam(self, draw):
              """
              usage: 创建干扰线
              para: draw 表示画笔
              return: None
              for:
              todo:
              """
              lineNum = random.randint(self.jamNum[0], self.jamNum[1])
              for i in range(lineNum):
                      begin = (random.randint(0, self.size[0]),
                                      random.randint(0, self.size[1])
                                      )
                      end = (random.randint(0, self.size[0]),
                                      random.randint(0, self.size[1])
                                      )
                      draw.line([begin, end], fill = (0, 0, 0))


      def getPicString(self):
              """
              usage: getPicString()
              return: string
              for : 生成给定长度的随机字符串
              todo: Nothing
              """
              length = self.length
              chars = self.chars
              selectedChars = random.sample(chars, length)
              charsToStr = string.join(selectedChars, '')
              return charsToStr
 
      def createChecker(self):
              """
              usage: createChecker()
              return: [str,pic]
              str:对应的字符串
              pic:对应的图片
              for:
              todo:
              """
              randStr = self.getPicString()
              randStr1 = string.join([i + " " for i in randStr], '')
              im = Image.new(self.mode, self.size, self.backgroundColor)
              draw = ImageDraw.Draw(im)
              draw.text(self.begin, randStr1, font = self.font,
                            fill = self.foregroundColor )
              self.createJam(draw)
              self.createPoints(draw)
              para = [1 - float(random.randint(1, 2))/100,
                            0,
                            0,
                            0,
                            1 - float(random.randint(1, 10))/100,
                            float(random.randint(1, 2))/500,
                            0.001,
                            float(random.randint(1, 2))/500
                              ]
              im = im.transform(im.size, Image.PERSPECTIVE, para)
              im = im.filter(ImageFilter.EDGE_ENHANCE_MORE)
              im.save("checker.jpg", self.outputType)
              return ([randStr, im])

if __name__ == "__main__":
      c = picChecker()
      t = c.createChecker()
      print(t)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值