一个python的验证码生成类

声明是从别的代码修改过来,如果你觉得眼熟,没错!就是你的代码!!

python需要一个PIL库用来画图

一个类简单生产图片对象,保存到一个缓存目录下面(这里是考虑缓存验证提高支持能力,(其实是不会直接生成到web))。

class captcha:
     #图片宽度
    width = 100
    #图片高度
    height = 40
    #背景颜色
    bgcolor = (255,255,255)
    #加载字体
    fontpath = '/tmp/FreeSans.ttf'
    #字体颜色
    fontcolor = (0,0,0)
    #保存地址
    imagepath = '/tmp/code.jpeg'

    def __init__(self):
        pass

    def output(self):
        #获取随即字符
        code = '1234'
        #生成背景图片
        image = Image.new('RGB',(self.width,self.height),self.bgcolor)
        #加载字体
        font = ImageFont.truetype(self.fontpath,30)
        draw = ImageDraw.Draw(image)
        #画字体,(0,0)是起始位置
        draw.text((0,0),code,font=font,fill=self.fontcolor)
        #释放draw
        del draw
        #保存原始版本
        image.save(self.imagepath)

        #新图片
        newImage = Image.new('RGB',(self.width,self.height),self.bgcolor)
        #load像素
        newPix = newImage.load()
        pix = image.load()
        offset = 0
        for y in range(0,self.height):
            offset += 1
            for x in range(0,self.width):
                #新的x坐标点
                newx = x + offset
                #你可以试试如下的效果
                #newx = x + math.sin(float(y)/10)*10
                if newx < self.width:
                    #把源像素通过偏移到新的像素点
                    newPix[newx,y] = pix[x,y]
        #保存扭曲后的版本
        newImage.save(self.imagepath)

        newImage = image.transform((self.width+30,self.height+10), Image.AFFINE, (1,-0.3,0,-0.1,1,0))
        newImage.save(self.imagepath)

        #创建draw,画线用
        draw = ImageDraw.Draw(newImage)
        #线的颜色
        linecolor= (0,0,0)
        for i in range(0,15):
            #都是随机的
            x1 = random.randint(0,self.width)
            x2 = random.randint(0,self.width)
            y1 = random.randint(0,self.height)
            y2 = random.randint(0,self.height)
            draw.line([(x1, y1), (x2, y2)], linecolor)

        #保存到本地
        newImage.save(self.imagepath)

使用方法:

captcha().output()

输出在web:

image_data = open('/tmp/1234_4.jpeg', "rb").read()
return HttpResponse(image_data, mimetype="image/jpeg") #这是django的输出方式


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值