WEB——验证码生成、IO存储、二进制传输

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37049781/article/details/83151129

运行下段程序,浏览器访问127.0.0.1:8000
即可在页面展现验证码
代码包含了验证码的生成 io储存 二进制数据传输等知识点

# coding=utf-8
# wsgi_server.py
import random
import string
import base64
from io import BytesIO
from PIL import Image, ImageDraw, ImageFont
from wsgiref.simple_server import make_server


class Captcha(object):
    def __init__(self, number=4, size_x=150, size_y=40, fontsize=35, line_num=2):
        self.number = number  # 生成几位数的验证码
        self.size = (size_x, size_y)  # 验证码图片的宽度和高度
        self.fontsize = fontsize  # 验证码字体大小
        self.line_number = line_num  # 加入干扰线的条数
        self.SOURCE = list(string.ascii_letters + "123456789")  # 构建一个验证码源文本,包括大小写数字

    ###################################生成干扰元素######################################
    def __gene_line(self, draw, width, height):
        # 开始点 X,Y
        begin = (random.randint(0, width), random.randint(0, height))
        # 结束点
        end = (random.randint(0, width), random.randint(0, height))
        # 画线条,开始 结束点  线条颜色  线条宽度
        draw.line([begin, end], fill=self.__gene_random_color(), width=2)

    def __gene_points(self, draw, point_chance, width, height):
        # 大小限制
        chance = min(50, 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=self.__gene_random_color())
    #########################################################################

    ############################# 生成随机的颜色 ###############################
    # 起始颜色 最终颜色
    def __gene_random_color(cls, start=0, end=255):
        # 初始化随机数
        random.seed()
        # 按范围生成随机输R  G  B
        return (random.randint(start, end), random.randint(start, end), random.randint(start, end))

    # 随机选择一个字体
    def __gene_random_font(cls):
        fonts = [
            # 字体文件路径
            '/usr/share/fonts/truetype/TTF/SourceCodePro-It.ttf',
        ]
        # 随机选一个 字体
        font = random.choice(fonts)
        return font

    # 用来随机生成一个字符串(包括英文和数字)
    def gene_text(self):
        # cls.SOURCE生成list A-Z a-z 0-9  number是生成验证码的位数
        return ''.join(random.sample(self.SOURCE, self.number))

    # 生成验证码
    def gene_graph_captcha(self):
        # 验证码图片的宽和高
        width, height = self.size
        # 创建图片
        # R:Red(红色)0-255  G:G(绿色)0-255   B:B(蓝色)0-255    A:Alpha(透明度),添加了A,则就只能生成png图片
        image = Image.new('RGB', (width, height), self.__gene_random_color(0, 100))
        # 验证码的字体  随机产生字体 字体大小
        font = ImageFont.truetype(self.__gene_random_font(), self.fontsize)
        # 创建画笔
        draw = ImageDraw.Draw(image)
        # 随机生成4为字符串
        text = self.gene_text()
        # 获取字体的尺寸
        font_width, font_height = font.getsize(text)
        # 填充字符串 x y坐标 文本 字体 字体颜色
        draw.text(((width - font_width) / 2, (height - font_height) / 2),
                  text, font=font, fill=self.__gene_random_color(150, 255))
        # 绘制干扰线 绘制多少条干扰线

        for x in range(0, self.line_number):
            self.__gene_line(draw, width, height)
            # 绘制噪点
            self.__gene_points(draw, 10, width, height)
        return text, image


# 开启图片验证码
def auth_code():
    # 获取验证码图片,和验证码值
    captcha=Captcha()
    code, img=captcha.gene_graph_captcha()
    #若要保存图片文件 此处 img.save(path)
    buf = BytesIO()  # 构建一个输入输出流
    img.save(buf, "jpeg")  # 将图片保存到输入输出流,也就是内存中
    bur_str = buf.getvalue()  # 获得输入输出流里面的内容
    # Base64是一种任意二进制到文本字符串的编码方法,常用于在URL、Cookie、网页中传输少量二进制数据。
    data = str(base64.b64encode(bur_str))
    return data


##################################为方便演示写一个简单的web程序##########################
def application(env, start_response):
    start_response('200 ok', [('Content-Type', 'text/html')])
    data = auth_code()
    res = "<img src= \"data:image/jpg;base64,%s\" >" % data
    print res
    return res


httpd = make_server('', 8000, application)
print "Serving is running..."
httpd.serve_forever()

猜你喜欢

转载自blog.csdn.net/qq_37049781/article/details/83151129