用pillow模块实现图片验证码

在微信公众号看到的一篇文章,想想自己也用过这么多验证码的轮子了,却没有从零开始实现一个验证码,所以自己动手码了一遍,的确加深了了解.

参考文章

完整代码

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

# pillow是PIL(Python成像库)的一个分支,它不再被维护。所以,为了保持向后兼容性,
# 往往使用旧的模块名称——PIL。所以,我们直接import PIL就可以了。

class Captcha:
    '''
    :param captcha_size:图片验证码的尺寸
    :param font_size:验证字体的大小
    :param text_number:验证码的字符数
    :param line_number:干扰线条数量
    :param background_color:图片背景色
    :param sources:取样字符集
    :param save_format:图片保存格式
    :return:
    '''

    def __init__(self, captcha_size=(150, 80),
                 font_size=40, text_number=4,
                 line_number=6, background_color=(255, 255, 255),
                 sources=None, save_format='png'):

        self.captcha_size = captcha_size
        self.font_size = font_size
        self.text_number = text_number
        self.line_number = line_number
        self.background_color = background_color
        self.format = save_format
        if sources:
            self.sources = sources
        else:
            self.sources = string.ascii_letters + string.digits

    def get_text(self):
        # 从sources字符集里面根据验证码数量随机生成一串字符
        text = random.sample(self.sources, k=self.text_number)
        return ''.join(text)

    def get_font_color(self):
        # 随机获取验证码中的字符的RGB颜色
        font_color = (random.randint(0, 150), random.randint(0, 150), random.randint(0, 150))
        return font_color

    def get_line_color(self):
        line_color = (random.randint(0, 250), random.randint(0, 250), random.randint(0, 250))
        return line_color

    def draw_text(self, draw, text, font, captcha_width, captcha_height, spacing=20):
        '''
        在图片上绘制传入的字符
        :param draw: 生成的画笔对象
        :param text: 绘制的字符
        :param font: 采用的字体
        :param captcha_width:验证码宽度
        :param captcha_height: 验证码高度
        :param spacing: 字符之间间隔
        :return:
        '''
        # 获得字符串的宽度,高度
        text_width, text_height = font.getsize(text)
        # 每个字符的大概宽度
        every_value_width = int(text_width / 4)

        # 这一串字符的总长度
        text_length = len(text)
        # 每两个字符之间拥有间隙,获取总的间隙???
        total_spacing = (text_length - 1) * spacing

        if total_spacing + text_width >= captcha_width:
            raise ValueError('字体加中间空隙超过图片总宽度')

        # 获取第一个字符绘制位置
        start_width = int(captcha_width - text_width - total_spacing)
        start_height = int((captcha_height - text_height) / 2)

        # 依次绘制每个字符
        for value in text:
            position = start_width, start_height
            print(position)
            # 绘制text
            draw.text(position, value, font=font, fill=self.get_font_color())
            # 改变下一个字符的起始绘制
            start_width = start_width + every_value_width + spacing

    def draw_line(self, draw, captcha_width, captcha_height):
        '''
        绘制线条
        :param draw:画笔对象
        :param captcha_width:验证码宽度
        :param captcha_height: 验证码高度
        :return:
        '''
        # 随即获取开始位置的坐标
        begin = (random.randint(0, captcha_width / 2), random.randint(0, captcha_height / 2))
        # 随机获取结束位置的坐标
        end = (random.randint(captcha_width / 2, captcha_width), random.randint(captcha_height / 2, captcha_height))
        draw.line([begin, end], fill=self.get_line_color())

    def draw_point(self, draw, point_chance, width, height):
        '''
        绘制干扰圆点
        :param draw: 画笔对象
        :param point_chance:绘制圆点的概率,point_chance / 100
        :param width: 验证码宽度
        :param height: 验证码高度
        :return:
        '''

        # 按照概率随机绘制小圆点
        for w in range(width):
            for h in range(height):
                tmp = random.randint(0, 100)
                if tmp < point_chance:
                    draw.point((w, h), fill=self.get_line_color())

    def make_captcha(self):
        # 制作验证码
        # 获取验证码的宽度,高度
        width, height = self.captcha_size
        # 生成一张图片
        captcha = Image.new('RGB', self.captcha_size, self.background_color)
        # 获取字体对象
        font = ImageFont.truetype('simkai.ttf', self.font_size)
        # 获取画笔对象
        draw = ImageDraw.Draw(captcha)
        # 得到绘制的字符
        text = self.get_text()

        # 绘制字符
        self.draw_text(draw, text, font, width, height)

        # 绘制线条
        for i in range(self.line_number):
            self.draw_line(draw, width, height)

        # 绘制小圆点 10/100=10%的概率
        self.draw_point(draw, 10, width, height)

        # 保存图片
        captcha.save('captcha', format=self.format)
        # 显示图片
        captcha.show()

if __name__ == '__main__':
    a = Captcha()
    a.make_captcha()

原文地址:https://www.cnblogs.com/xiujin/p/11473939.html

时间: 2024-10-16 04:08:14

用pillow模块实现图片验证码的相关文章

node.js利用captchapng模块实现图片验证码

安装captchapng模块 npm install captchapng nodejs中使用 var express = require('express'); var captchapng = require('captchapng'); //验证码 exports.verify= function(req, res, next) { var code = parseInt(Math.random() * 9000 + 1000); req.session.checkcode = code;

Django 生成验证码或二维码 pillow模块

一.安装PIL PIL:Python Imaging Library,已经是Python平台事实上的图像处理标准库了.PIL功能非常强大,API也非常简单易用. ? PIL模块只支持到Python 2.7,许久没更新了,在python 3.* 版本上使用Pillow模块 ? 安装Pillow ? pip install pillow 二.pillow 基本使用 图像缩放 from PIL import Image # 当前路径打开一个jpg图像文件 img = Image.open('test.

【Nodejs项目手记】Nodejs中使用图片验证码,captchapng模块可以解决Nodejs图片验证码

Nodejs项目,在做图片验证码的时候遇到了难题.Nodejs没有图片库,以后会有,但是现在没有. 网络上搜索一圈,有几个解决方案: 1.采用第三方验证码程序,有的时候,项目可能不允许: 2.使用Java或者PHP生成图片,Nodejs调用,中间采用Redies共享: 这两种方式都不太理想,好在终于找到了可以支持Nodejs图片验证码的一个库,虽然只支持数字,但是也还不错.原理是使用Base64的图片编码方式. 这个库的Gighub地址是:https://github.com/GeorgeCha

ASP.NET MVC 模块与组件(二)——定制图片验证码

 本着简洁直接,我们就直奔主题吧! 下面是一个生成数字和字母随机组合的验证码类源代码: using System; using System.Drawing; using System.Drawing.Imaging; using System.Web.UI; using System.Drawing.Drawing2D; using System.IO; namespace Forcheng.Code { /// <summary> /// 生成验证码的类 /// </summary&

随机图片验证码的生成

Python生成随机验证码,需要使用PIL模块. 安装: 1 pip3 install pillow 基本使用 1. 创建图片 1 2 3 4 5 6 7 8 9 from PIL import Image img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))   # 在图片查看器中打开 # img.show()   # 保存在本地 with open('code.png','wb') as f:     img.s

Python使用PIL模块生成随机验证码

PIL模块的安装 pip3 install pillow 生成随机验证码图片 import random from PIL import Image, ImageDraw, ImageFont from io import BytesIO def random_str(): ''' 生成随机字符 :return:随机字符 ''' random_int = str(random.randint(0,9)) random_up = chr(random.randint(65,90)) random_

Python图片验证码降噪 — 8邻域降噪

简介 图片验证码识别的可以分为几个步骤,一般用 Pillow 库或 OpenCV 来实现,这几个过程是: 1.灰度处理&二值化 2.降噪 3.字符分割 4.标准化 5.识别 所谓降噪就是把不需要的信息通通去除,比如背景,干扰线,干扰像素等等,只留下需要识别的字符,让图片变成2进制点阵,方便代入模型训练. 8邻域降噪 8邻域降噪 的前提是将图片灰度化,即将彩色图像转化为灰度图像.以RGN色彩空间为例,彩色图像中每个像素的颜色由R .G.B三个分量决定,每个分量由0到255种取值,这个一个像素点可以

pillow基本使用及验证码生成

pillow基本使用: 1.安装pillow模块 pip install pillow 2.pillow模块的基本使用 1.创建图片 from PIL import Image?#定义使用Image类实例化一个长为400px,宽为400px,基于RGB的(255,255,255)颜色的图片img1=Image.new(mode="RGB",size=(400,400),color=(255,255,255))??#把生成的图片保存为"pic.png"格式with o

图像处理pillow模块

pillow模块: -->基本的图像处理模块 Pip install pillow from PIL import Image #1.读取图片 im = Image.open('/test.jpg') # 读取图片 im.show() # 展示 im.save("save.gif","GIF") #保存图像为gif格式(必须指定图片格式) #2.创建图片 Image.new(mode,size) Image.new(mode,size,color) newIm