python3用pillow生成验证码,tornado中输出图片

验证码生成类:

from PIL import Image,ImageDraw, ImageFont, ImageFilter
import random

class VerifyCode():

    def __init__(self):
        self._letter_cases = 'abcdefghjkmnpqrstuvwxy'
        self._upper_cases = self._letter_cases.upper()
        self._numbers = ''.join(map(str, range(3, 10)))
        pass

    def createCodeImage(self,size=(120,30),img_type='jpg',
                        mode='RGB',bg_color=(255,255,255),fg_color=(0,0,255),
                            font_size=18,font_type='arial.ttf',
                            length=4,draw_lines=True,n_line=(1,2),
                            draw_points=True,point_chance=2):
        width,height = size;
        img = Image.new(mode, size, bg_color);
        draw = ImageDraw.Draw(img)

        def get_chars():
            return random.sample(self._letter_cases,length)

        def creat_line():
            line_num = random.randint(*n_line)#sign that the param is a list

            for i in range(line_num):
                begin = (random.randint(0, size[0]), random.randint(0, size[1]))
                end = (random.randint(0, size[0]), random.randint(0, size[1]))
                draw.line([begin, end], fill=(0, 0, 0))

        def create_points():
            chance = min(100, max(0, int(point_chance)))
            for w in range(width):
                for h in range(height):
                    tmp = random.randint(0, 100)
                    if tmp > 100 - chance:
                        draw.point((w, h), fill=(0, 0, 0))



        def create_strs():
            c_chars = get_chars()
            strs = ' %s ' % ' '.join(c_chars)
            font = ImageFont.truetype(font_type, font_size)
            font_width, font_height = font.getsize(strs)
            draw.text(((width - font_width) / 3, (height - font_height) / 3),
                        strs, font=font, fill=fg_color)
            return ''.join(c_chars)



        if draw_lines:
            creat_line()
        if draw_points:
            create_points()
        strs = create_strs()

        params = [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
                  ]
        img = img.transform(size, Image.PERSPECTIVE, params)
        img = img.filter(ImageFilter.EDGE_ENHANCE_MORE)
        return img, strs
#
# if __name__ == '__main__':
#     code_img,capacha_code= creat_validata_code()
#     code_img.save('xx.jpg','JPEG')

控制器如下:

#coding:utf-8
import tornado.httpserver
import tornado.ioloop
import tornado.process
import tornado.web
from app.common.VerifyCode import *
from app.web.base.BaseHandler import BaseHandler
from io import BytesIO
class verifyCode(BaseHandler):
    def get(self, *args, **kwargs):
        #self.write("go back")
        #self.render("admin/index.mako")
        vecode=VerifyCode()

        code_img,capacha_code= vecode.createCodeImage();
        #self.write(capacha_code)
        msstream=BytesIO()
        code_img.save(msstream,"jpeg")
        code_img.close()
        self.set_header('Content-Type', 'image/jpg')
        self.write(msstream.getvalue())


    def post(self, *args, **kwargs):
        self.get(self,args,kwargs)

你可能感兴趣的:(python3用pillow生成验证码,tornado中输出图片)