Python 生成随机验证码图像(数字与大小写字母组合,验证码图像旋转并添加图像噪声,生成bmp图像)

2023-05-16

Python 生成随机验证码(数字与大小写字母组合,验证码图像旋转并添加图像噪声,生成bmp图像)

代码如下:

from array import array
import random
import cv2 
import PIL.ImageFont as ImageFont
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt

# http://mirrors.aliyun.com/pypi/simple/

class bmp:
    """ bmp data structure """
 
    def __init__(self, w=1080, h=1920, color = 0xffffff):
        self.w = w
        self.h = h
        self.gen_bmp_header()
        self.paint_bgcolor(color)
 
    def calc_data_size (self):
        if((self.w*3)%4 == 0):
            self.dataSize = self.w * 3 * self.h
        else:
            self.dataSize = (((self.w * 3) // 4 + 1) * 4) * self.h
 
        self.fileSize = self.dataSize + 54
 
    def conv2byte(self, l, num, len):
        tmp = num
        for i in range(len):
            l.append(tmp & 0x000000ff)
            tmp >>= 8
 
    def gen_bmp_header (self):
        self.calc_data_size();
        self.bmp_header = [0x42, 0x4d]
        self.conv2byte(self.bmp_header, self.fileSize, 4) #file size
        self.conv2byte(self.bmp_header, 0, 2)
        self.conv2byte(self.bmp_header, 0, 2)
        self.conv2byte(self.bmp_header, 54, 4) #rgb data offset
        self.conv2byte(self.bmp_header, 40, 4) #info block size
        self.conv2byte(self.bmp_header, self.w, 4)
        self.conv2byte(self.bmp_header, self.h, 4)
        self.conv2byte(self.bmp_header, 1, 2)
        self.conv2byte(self.bmp_header, 24, 2) #888
        self.conv2byte(self.bmp_header, 0, 4)  #no compression
        self.conv2byte(self.bmp_header, self.dataSize, 4) #rgb data size
        self.conv2byte(self.bmp_header, 0, 4)
        self.conv2byte(self.bmp_header, 0, 4)
        self.conv2byte(self.bmp_header, 0, 4)
        self.conv2byte(self.bmp_header, 0, 4)
 
    def print_bmp_header (self):
        length = len(self.bmp_header)
        for i in range(length):
            print("{:0>2x}".format(self.bmp_header[i]), end=' ')
            if i%16 == 15:
                print('')
        print('')
 
    def paint_bgcolor(self, color=0xFFB6C1):
        self.rgbData = []
        for r in range(self.h):
            self.rgbDataRow = []
            for c in range(self.w):
                self.rgbDataRow.append(color)
            self.rgbData.append(self.rgbDataRow)
 
    def paint_line(self, x1, y1, x2, y2, color):
        k = (y2 - y1) / (x2 - x1)
        for x in range(x1, x2+1):
            y = int(k * (x - x1) + y1)
            self.rgbData[y][x] = color
 
    def paint_rect(self, x1, y1, w, h, color):
        for x in range(x1, x1+w):
            for y in range(y1, y1+h):
                self.rgbData[y][x] = color
 
    def paint_point(self, x, y, color=0x000000):
        self.rgbData[y][x] = color
 
    def save_image(self, name="save.bmp"):
        f = open(name, 'wb')
 
        #write bmp header
        f.write(array('B', self.bmp_header).tobytes())
 
        #write rgb data
        zeroBytes = self.dataSize // self.h - self.w * 3
 
        for r in range(self.h):
            l = []
            for i in range(len(self.rgbData[r])):
                p = self.rgbData[r][i]
                l.append(p & 0x0000ff)
                p >>= 8
                l.append(p & 0x0000ff)
                p >>= 8
                l.append(p & 0x0000ff)
 
            f.write(array('B', l).tobytes())
 
            for i in range(zeroBytes):
                f.write(bytes([0x00]))
 
        #close file
        f.close()
        


def generate_text(text):
    
    global mask
    
    fnt = ImageFont.truetype('arial.ttf', 60)

    img = Image.new("RGB",fnt.getsize(text),(255,182,193))
    
    #img = Image.new("RGB",(32,32),(255,182,193))
    
    mask = [x for x in fnt.getmask(text, mode='RGB')]

    img.putdata(mask)

    #img = img.convert('RGB')

    return img

def rgb2hex(RGB):
    text = '0x' + ''.join([hex(i)[-2:].replace('x', '0') for i in list(map(int, RGB))])
    return text

 
if __name__ == '__main__':
 
    w = int(45*6*2*0.677)
    h = 45*2
    image = bmp(w, h)
    image.paint_bgcolor(color=0xFFB6C1)
    for i in range(w):
        ii = random.randint(0,h-1)
        r = random.randint(0,255)
        g = random.randint(0,255)
        b = random.randint(0,255)
        rgb = r*256*256+g*256+b
        image.paint_point(i,ii,rgb)
 
    image.save_image("save1.bmp")
    import os
    os.system("save1.bmp")
    img_bg = cv2.imread("save1.bmp")
    img3 = img_bg
    img_change = Image.fromarray(cv2.cvtColor(img_bg, cv2.COLOR_BGR2RGB))
    code = ''
    code_end = ""
    for i in range(6):
        code = ''
        n = random.randint(0, 9)
        b = chr(random.randint(65, 90))
        s = chr(random.randint(97, 122))
        #code = str(random.choice([n, b, s]))
        code_c = [n,b,s]
        choice = random.randint(0,2)
        code = code_c[choice]
        code_end += str(code)
        img_smaller = generate_text(str(code))
        angle = random.randint(0,4)
        angle2 = random.randint(0,90)
        img_smaller = img_smaller.rotate(angle2)
        if angle == 0:
            img_smaller  = img_smaller.transpose(Image.ROTATE_270)
        elif angle == 1:
            img_smaller  = img_smaller.transpose(Image.ROTATE_180)
        elif angle == 2:
            img_smaller  = img_smaller.transpose(Image.ROTATE_90) 
        else:
            print(end="")   
        #img_smaller.resize((28,22))
        #img2 = cv2.imread("1.jpg")
        img_change.paste(img_smaller,(60*i,10))
        
print(code_end)
img_change.show()               

效果如下:

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 生成随机验证码图像(数字与大小写字母组合,验证码图像旋转并添加图像噪声,生成bmp图像) 的相关文章

  • openstack官方文档查找

    openstack官网 xff1a www openstack org https docs openstack org ocata zh CN install guide rdo environment html ocata中文安装手册网
  • Ubuntu下为Apache简单配置SSL的方法(HTTPS的实现)

    1 启用 ssl 模块 sudo a2enmod ssl 2 安装openssl sudo apt get install openssl 3 创建CA签名 不使用密码去除 des3选项 openssl genrsa des3 out se
  • Linux查看防火墙,开放端口

    1 查看防火墙状态 systemctl status firewalld 2 如果不是显示active状态 xff0c 需要打开防火墙 systemctl start firewalld 3 查看所有已开放的临时端口 xff08 默认为空
  • 05_用户管理

    目录 一 用户及用户组存在的意义二 用户及用户组在系统中的存在方式三 用户切换01 用户查看02 用户切换 四 用户涉及到的系统配置文件01 etc passwd 02 etc group 03 etc skel 04 etc shadow
  • Java String匹配算法

    1 String匹配算法 在一个文本或者较长的一段字符串中 xff0c 找出一个指定字符串 xff0c 并返回其位置 指定一个父类AbstractMatch xff0c 使用matchAtPosition String int 查看是否匹配
  • pycharm从远程仓库clone时“Authentication failed for '仓库地址'”的问题解决

    背景 xff1a 使用pycharm Git clone 时 xff0c 输错了账户名 xff0c 提示 Authentication failed for 39 仓库地址 39 xff0c 但pycharm将错误的账户名保存了 xff0c
  • windows10安装docker的若干坑--Docker Desktop requires Windows 10 Pro/Enterprise (15063+)

    安装docker for windows时报错 xff1a Docker Desktop requires Windows 10 Pro Enterprise 15063 43 or Windows 10 Home 19018 43 原因
  • sklearn接口报错Input contains NaN, infinity or a value too large for dtype(‘float64‘)

    1 错误场景 某个包调用了sklearn接口 xff0c 在fit x y 时报错Input contains NaN infinity or a value too large for dtype 39 float64 39 2 错误原因
  • 在shell中执行conda activate报错:Your shell has not been properly configured to use ‘conda activate‘.

    今天想要在Mac上执行一段自动启动jupyter的shell脚本 xff0c 但是出现了错误 错误代码 xff1a CommandNotFoundError Your shell has not been properly configur
  • centos7安装CUDA11.2+CUDNN8.1+tensorflow2.4

    环境 xff1a 系统 xff1a centos7 CPU xff1a Intel R Xeon R Gold 5220 CPU 64 2 20GHz 36核 GPU xff1a Tesla V100 4 查看CPU信息 xff1a cat
  • 开源时序建模框架Kats

    KATS简介 时间序列分析建模是数据科学和机器学习的一个重要的领域 xff0c 在电子商务 金融 供应链管理 医学 气象 能源 天文等诸多领域有着广泛的应用 目前时间序列分析以及建模的技术非常多 xff0c 但相对散乱 Facebook开源
  • 包含动画的PPT转为PDF

    目的 xff1a 带动画的PPT转化为PDF xff0c PDF的每一页是动画的一个步骤 方法 xff1a 使用 宏 参考链接 xff1a https www codercto com a 70548 html 具体方法 xff08 win
  • windows中docker编写一个dockerfile文件

    Dockerfile文件描述了当我们启动镜像的时候需要哪些软件元素 除了软件元素之外 xff0c Dockerfile 还能够让我们能够在启动镜像的时候在容器中运行一些命令或者指明我们使用什么样的环境 使用虚拟机中的vim命令编写docke
  • spyder增加模块代码提示功能

    最近在配置tensorflow xff0c 可是发现使用spyder的时候无法加载tensorflow的代码提示 xff0c 需要自己输入完整的函数名称 xff0c 十分不方便 xff0c 于是从网上找了一些资料 xff0c 来解决spyd
  • conda activate报错:gbk相关错误

    使用conda create n 建立新的虚拟环境后 xff0c 使用activate无法进入虚拟环境 xff0c 报了一个和gbk相关的错误 xff0c 后来经排查发现 xff0c 是系统环境变量中包含中文字符 xff0c 把系统变量中所
  • scanf源码分析

    本文分析的是glibc2 31中的scanf相关源码 xff0c 目的不是研究scanf的算法 xff0c 而是说明scanf在IO attack中的利用方法 xff0c 属于CTF的范畴 scanf c 其实就是对 vscanf inte
  • windows建立定时任务执行bat脚本

    在Linux中我们可以通过crontab来定时执行脚本 xff0c 那么windows中如何执行呢 xff1f 为了避免分支冲突 xff0c 准备在每天上班的时候自动将git远程仓库的最新版本pull下来 xff0c 然后在下班时间自动将重
  • 需账号密码登陆的网页爬虫

    对于普通网页的爬取十分简单 xff0c 如果网站没有任何反爬机制 xff0c 只要以下代码就可以实现对于网页的爬取 span class token keyword import span requests html span class
  • sqlserver通过OPENJSON转换 json数据

    OPENJSON 行集函数可将 JSON 文本转换为一组行和列 使用 OPENJSON 将 JSON 集合转换为行集后 xff0c 可以在返回的数据上运行任意 SQL 查询或将其插入到 SQL Server 表中 OPENJSON 函数采用
  • [linux]armbian修改为清华源

    查看系统发行版本 命令lsb release a 本机为基于Debian的armbian buster 所以用清华Debian源 修改apt为清华软件源 备份原文件 sudo cp etc apt sources list etc apt

随机推荐