【Python 滑块不同的操作】对滑块进行处理,列如切割、还原、去除、无脑识别距离等等

文章日期:2024.03.23

使用工具:Python

类型:图片滑块验证的处理(不限于识别距离)

使用场景:?

文章全程已做去敏处理!!!  【需要做的可联系我】

AES解密处理(直接解密即可)(crypto-js.js 标准算法):在线AES加解密工具

今天的这个案例的主要作用是方便大家对滑块的研究、使用、学习、原理理解等..... 

源码在文章结尾,源码有详细注释,有任何问题直接私信!!!     持续更新中........

目录

1、极验3.0滑块 【还原】【距离计算】- 还原滑块背景图,并计算出缺口距离

2、极验4.0滑块 【转换】- 小拼图转长拼图

3、简书滑块 【切割】- 切割出仅有缺口的滑道

4、网易易盾滑块 【转换】- 长拼图转小拼图

5、极验4.0滑块 【去除】- 拼图去除半透明像素

【附上源码-python】- 持续更新


使用场景:

1、极验3.0滑块 【还原】【距离计算】- 还原滑块背景图,并计算出缺口距离

需要材料:完整滑块背景图(图片)、有缺口的滑块背景图(图片)

# 还原 完整滑块背景图  将还原后的结果保存为名字为:a1   默认会自动添加文件后缀名png
Slide_processing().background_reduction('1.jpg',True,'a1')
# 还原 有缺口的滑块背景图  将还原后的结果保存为名字为:a2   默认会自动添加文件后缀名png
Slide_processing().background_reduction('2.jpg',True,'a2')
# 放入 【完整滑块背景图】 和 【有缺口的滑块背景图】 计算缺口的距离  strict:容错值,默认为0
print(Slide_processing().slider_identify_background('a1.png','a2.png',strict=200))

2、极验4.0滑块 【转换】- 小拼图转长拼图

需要材料:小拼图(图片)、背景图的总高度(数字距离)、服务器返回的拼图放置高度(数字距离)

 

'''
:param p_puzzle_path:  本地小拼图的的路径
:param total_height:  背景图图片的总高度 - 上下距离 - 最终拼图的高度 - 要和滑块的背景图的高度一致
:param starting_height:  拼图图片的放置位置,从上倒下计算距离,设置20则表示从上到下,距离20个像素点开始放置拼图 - 通常服务器会返回此参数
:param save_file:  是否保存最终修改后的图片  默认False不保存 
:param save_file_path:  保存最终修改后的图片名称,不含后缀    默认:自动生成 (使用此参数请先开启save_file)
:return: base64图片
'''
print(Slide_processing().slider_puzzle_big(p_puzzle_path='a1.png',total_height=200,starting_height=95,save_file=True,save_file_path='q1'))

3、简书滑块 【切割】- 切割出仅有缺口的滑道

需要材料:有缺口的滑块背景图(图片)、长拼图(图片)

# 将正常大拼图转换为小拼图 - 放置长拼图 - 文章下面有此函数的详细讲解
G = Slide_processing().slider_puzzle_qg('a2.png')
print(G)
'''
:param b_puzzle_path:  本地滑块背景图的路径
:param b_size_h:  小拼图在背景图中的所在高度,上下距离
:param p_size_h:  小拼图的高度大小
:param save_file:  是否保存最终修改后的图片 默认False
:param save_file_path:  保存最终修改后的图片名称,不含后缀    默认:自动生成
:return: base64图片
'''
print(Slide_processing().background_cutting(b_puzzle_path='a1.png',b_size_h=G['最顶层-顶层距离'],p_size_h=G['中间层-拼图的高度'],save_file=True,save_file_path='s1'))

4、网易易盾滑块 【转换】- 长拼图转小拼图

需要材料:长拼图(图片)

# 将正常大拼图转换为小拼图 - 放置长拼图
'''
:param p_puzzle_path:  本地长拼图的路径
:param save_file:  是否保存最终修改后的图片 默认False
:param save_file_path:  保存最终修改后的图片名称,不含后缀    默认:自动生成
:return: {'最顶层-顶层距离''中间层-拼图的高度''最底层-底层距离''base64'}
'''
G = Slide_processing().slider_puzzle_qg(p_puzzle_path='a1.png',save_file=True,save_file_path='s1')
print(G)

5、极验4.0滑块 【去除】- 拼图去除半透明像素

需要材料:拼图(图片)

'''
:param p_puzzle_path:  本地小拼图的路径
:param save_file:  是否保存最终修改后的图片 默认False
:param save_file_path:  保存最终修改后的图片名称,不含后缀    默认:自动生成
:return: base64图片
'''
print(Slide_processing().slider_puzzle_remove_tm(p_puzzle_path='a1.png',save_file=True,save_file_path='s1'))

【附上源码-python】- 持续更新

import numpy as np
from PIL import Image
import io
import time
import base64class Slide_processing:def __init__(self):pass# 将小拼图转为正常大拼图def slider_puzzle_big(self,p_puzzle_path: str = '',total_height: int = 300,starting_height: int = 50,save_file: bool = False,save_file_path: str = ''):''':param p_puzzle_path:  本地小拼图的的路径:param total_height:  设置图片总高度 - 上下距离 - 最终拼图的高度 - 要和滑块的背景图的高度一致:param starting_height:  设置拼图图片的放置位置,从上倒下计算距离,设置20则表示从上到下,距离20个像素点开始放置拼图:param save_file:  是否保存最终修改后的图片 默认False:param save_file_path:  保存最终修改后的图片名称,不含后缀    默认:自动生成:return: base64图片'''# 打开小拼图图片image = Image.open(p_puzzle_path)# 获取图片的宽高width, height = image.size# 获取图片的像素数据pixels = image.load()# 创建空白图片 - 高:自定义  宽:拼图的宽度  颜色:透明  格式:pngnew_image = Image.new('RGBA', (width, total_height), color=(0, 0, 0, 0))# 开始循环读取拼图的每一个像素值,然后放到空白图片中# 循环读取拼图的高度(上下距离)for x in range(height):# 循环读取拼图的宽度(左右距离)for y in range(width):# 读取png像素点 RGBA 值   (png是4通道、jpg是3通道)  PNG:RGBA  JPG:RGBr, g, b, a = pixels[x, y]# starting_height 是像素开始更改的位置,也是我们设置拼图要放的地方(高度)# 将空白图片的某像素点,更改为当前拼图的像素点,以达到小拼图变长图的目的new_image.putpixel((x, starting_height + y), (r, g, b, a))if save_file:if save_file_path:new_image.save(save_file_path + '.png')else:# 保存最终图片  随机名称new_image.save(''.join(str(time.time()).split('.') + [".png"]))buffered = io.BytesIO()# 将数据写入buffered里new_image.save(buffered, format="PNG")return base64.b64encode(buffered.getvalue()).decode()# 将小拼图内透明不一的杂质全部改为透明def slider_puzzle_remove_tm(self,p_puzzle_path: str = '',save_file: bool = False,save_file_path: str = ''):''':param p_puzzle_path:  本地小拼图的路径:param save_file:  是否保存最终修改后的图片 默认False:param save_file_path:  保存最终修改后的图片名称,不含后缀    默认:自动生成:return: base64图片'''# 打开小拼图 图片image = Image.open(p_puzzle_path)width, height = image.size# 转为RGBA格式image = image.convert("RGBA")# 获取图片的像素数据pixels_1 = image.load()for x in range(height):for y in range(width):r, g, b, a = pixels_1[y,x]if a != 255:r, g, b, a = 0,0,0,0# 将空白图片的某像素点,更改为当前拼图的像素点,以达到小拼图变长图的目的image.putpixel((y,x), (r, g, b, a))if save_file:if save_file_path:image.save(save_file_path + '.png')else:# 保存最终图片  随机名称image.save(''.join(str(time.time()).split('.') + [".png"]))buffered = io.BytesIO()# 将数据写入buffered里image.save(buffered, format="PNG")return {'base64': base64.b64encode(buffered.getvalue()).decode()}# 将正常大拼图转换为小拼图, 使用前先去掉多余的透明def slider_puzzle_qg(self,p_puzzle_path: str = '',save_file: bool = False,save_file_path: str = ''):''':param p_puzzle_path:  本地长拼图的路径:param save_file:  是否保存最终修改后的图片 默认False:param save_file_path:  保存最终修改后的图片名称,不含后缀    默认:自动生成:return: base64图片'''# 打开大拼图图片image = Image.open(p_puzzle_path)width, height = image.sizepixels = image.load()# 采用红绿灯模式 存储和记录信息# _a:第一层-行数  _b:第二层-行数  _c:第三层-行数  k:记录拼图的像素数据_a = 0  # 红灯-最顶层 - 透明_b = 0  # 黄灯-中间层 - 数据核心 - 拼图的像素_c = 0  # 绿灯-最底层 - 透明k = []  # 将拼图的像素存储, 存储为一维数组buffered = io.BytesIO()for x in range(height):# 临时的行数据像素 - 左右data_pixel = []for y in range(width):# 读取png像素点 RGBA 值   (png是4通道、jpg是3通道)  PNG:RGBA  JPG:RGBr, g, b, a = pixels[y, x]data_pixel += [(r, g, b, a)]# 转换为NumPy数组NumPy_data_pixel = np.array(data_pixel)# 计算一整行像素值是否为透明, 是透明则跳过并记录在红绿灯内, 如果不是透明则将数据进行存储并记录在红绿灯内# True:透明(无数据)   False:不透明(有数据)if np.all(NumPy_data_pixel == 0):if _b == 0:# 记录最顶层的行数 - 小拼图距离顶部的距离_a += 1else:# 当开始底层为0时,则表示第一次执行此命令,则要存储刚刚所保存的一维像素数组数据, 保存为图片if _c == 0:# 创建空白图片 - 宽:拼图的宽度   高:通过数据层获取    颜色:透明  格式:pngnew_image = Image.new('RGBA', (width, _b), color=(0, 0, 0, 0))# 采用一维的像素组数据写入图片new_image.putdata(k)# 将数据写入buffered里new_image.save(buffered, format="PNG")if save_file:if save_file_path:new_image.save(save_file_path + '.png')else:# 保存最终图片  随机名称new_image.save(''.join(str(time.time()).split('.') + [".png"]))# 记录最底层的行数 - 小拼图距离底部的距离_c += 1else:# 记录拼图的有多少行-高度-上下距离-仅拼图的高度_b += 1# 拼图的像素数据 一维k += data_pixel# 最后返回字典格式数据return {'最顶层-顶层距离': _a,'中间层-拼图的高度': _b,'最底层-底层距离': _c,'base64': base64.b64encode(buffered.getvalue()).decode()}# 滑块识别距离, 放入完整滑块背景图 和 残缺滑块背景图def slider_identify_background(self,file_1, file_2,strict=0):''':param file_1: 完整滑块背景图:param file_2: 残缺滑块背景图:param strict: 严格模式 针对极验, 当残缺滑块和完整滑块的像素有差别时,需要填写最多不能相差多少像素, 建议200以下,200即可:return: {w:滑道距离}'''# 打开图片image_1 = Image.open(file_1)image_2 = Image.open(file_2)# 获取图片的像素数据pixels_1 = image_1.load()pixels_2 = image_2.load()# 循环图片的宽度 左右距离for w in range(239):# 循环图片的长度/高度 上下距离for h in range(149):# 第一张缺口图 循环每一个像素color1 = pixels_1[w, h]# 第二张完整图 循环每一个像素color2 = pixels_2[w, h]if strict:# 严格模式,检测变化较大的参数, 如果存在则表示缺口很明显if (-strict > sum(np.array(color1)-np.array(color2))) or ((sum(np.array(color1)-np.array(color2))) > strict):return {'w': w}else:# 检测两张图的像素是否有变化,如果像素有变化,说明有缺口,则直接返回宽度即可,长度可以不要if color1 != color2:return {'w': w}return {'w': '未计算出!!!'}# 将滑块背景图切割为小滑道def background_cutting(self,b_puzzle_path: str = '',b_size_h: int = 0,p_size_h: int = 0,save_file: bool = False,save_file_path: str = ''):''':param b_puzzle_path:  本地滑块背景图的路径:param b_size_h:  小拼图在背景图中的所在高度,上下距离:param p_size_h:  小拼图的高度大小:param save_file:  是否保存最终修改后的图片 默认False:param save_file_path:  保存最终修改后的图片名称,不含后缀    默认:自动生成:return: base64图片'''# 打开图片image = Image.open(b_puzzle_path)width, height = image.size# 宽度,从左到右的距离left, right = 0, width# 高度,从上到下的距离top, bottom = b_size_h, b_size_h + p_size_h# 切割图片cropped_image = image.crop((left, top, right, bottom))if save_file:if save_file_path:cropped_image.save(save_file_path + '.png')else:# 保存最终图片  随机名称cropped_image.save(''.join(str(time.time()).split('.') + [".png"]))buffered = io.BytesIO()# 将数据写入buffered里cropped_image.save(buffered, format="PNG")return {'base64': base64.b64encode(buffered.getvalue()).decode()}# 滑块背景图还原 - 极验3.0def background_reduction(self,b_puzzle_path: str = '',save_file: bool = False,save_file_path: str = ''):''':param b_puzzle_path:  本地滑块背景图的路径 可处理3.0极验:param save_file:  是否保存最终修改后的图片 默认False:param save_file_path:  保存最终修改后的图片名称,不含后缀    默认:自动生成:return: base64图片'''# 打开PNG图片image = Image.open(b_puzzle_path)# 创建新的空白图片new_image = Image.new('RGBA', (260, 160))# 坐标k = 0# 定值, 在极验3.0版本中, 通过画布断点获取数据ut = [39,38,48,49,41,40,46,47,35,34,50,51,33,32,28,29,27,26,36,37,31,30,44,45,43,42,12,13,23,22,14,15,21,20,8,9,25,24,6,7,3,2,0,1,11,10,4,5,19,18,16,17]# ut有多少参数, 就有多少个小碎片拼图for _ in range(len(ut)):# 通过计算得出 小碎片的起始坐标c = ut[_] % 26 * 12 + 1# 计算是否当前小碎片在第一层还是第二层, 三元表达式u = (lambda: 80 if 25 < ut[_] else 0)()# 将裁切下来小碎片的数据存储image2 = image.crop((c, u, c + 10, u + 80))# 当存储量达到26, 则重置小碎片的放置坐标, 每层只能放26小碎片if _ == 26:k = 0if _ > 25:# 第二层new_image.paste(image2, (k, 80))k += 10else:# 第一层new_image.paste(image2, (k, 0))k += 10if save_file:if save_file_path:new_image.save(save_file_path + '.png')else:# 保存最终图片  随机名称new_image.save(''.join(str(time.time()).split('.') + [".png"]))buffered = io.BytesIO()# 将数据写入buffered里new_image.save(buffered, format="PNG")return {'base64': base64.b64encode(buffered.getvalue()).decode()}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/764962.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python计算机二级选择易错题(三)

选择题第02&#xff0c;03&#xff0c;04套 题目来源&#xff1a;python计算机二级真题&#xff08;选择题&#xff09; - 知乎 选择题第02套 选择题第03套 选择题第04套 time()获取当前时间&#xff0c;即计算机内部时间&#xff0c;浮点数&#xff1b;import time库&#x…

用户多部门切换部门,MySQL根据多个部门id递归获取所有上级(祖级)、获取部门的全路径(全结构名称)

背景 之前做过的项目&#xff0c;都是一个用户就一个部门的&#xff0c;现在碰到个一个用户在多个部门的需求&#xff0c;而且需要可以切换不同部门查看不同数据。 就比如说一个大公司下面有多个子公司&#xff0c;每个子公司有好多部门、子部门等等&#xff0c;然后有部分用…

【赠书第21期】游戏力:竞技游戏设计实战教程

文章目录 前言 1 竞技游戏设计的核心要素 1.1 游戏机制 1.2 角色与技能 1.3 地图与环境 2 竞技游戏设计的策略与方法 2.1 以玩家为中心 2.2 不断迭代与优化 2.3 营造竞技氛围与社区文化 3 实战案例分析 4 结语 5 推荐图书 6 粉丝福利 前言 在数字化时代的浪潮中&…

Rust之构建命令行程序(五):环境变量

开发环境 Windows 11Rust 1.77.0 VS Code 1.87.2 项目工程 这次创建了新的工程minigrep. 使用环境变量 我们将通过添加一个额外的功能来改进minigrep:一个不区分大小写的搜索选项&#xff0c;用户可以通过环境变量打开该选项。我们可以将此功能设置为命令行选项&#xff0c;…

uniapp(vue3) H5页面连接打印机并打印

一、找到对应厂商打印机的驱动并在windows上面安装。查看是否安装完成可以在&#xff1a;控制面板->查看设备和打印机&#xff0c;找到对应打印机驱动是否安装完成 二、打印机USB连接电脑 三、运行代码调用浏览器打印&#xff0c;主要使用的是window.print()功能。下面使用…

前端学习笔记 | Node.js

一、Node.js入门 1、什么是Node.js 定义&#xff1a;是跨平台JS运行环境&#xff08;可以独立执行JS的环境&#xff09;作用&#xff1a; 编写数据接口&#xff0c;提供网页资源功能等等前端工程化&#xff1a;为后续学Vue和React等框架做铺垫 2、Node.js为何能执行JS&#xff…

python分类信息服务平台移动端的设计与实现flask-django-php-nodejs

分类信息服务平台设计的目的是为用户提供活动信息、活动记录等方面的平台。 与PC端应用程序相比&#xff0c;分类信息服务平台的设计主要面向于移动端&#xff0c;旨在为管理员和用户、商铺提供一个分类信息服务平台。用户可以通过Android及时查看活动信息等。 分类信息服务平台…

IDEA调优-四大基础配置-编码纵享丝滑

文章目录 1.JVM虚拟机选项配置2.多线程编译速度3.构建共享堆内存大小4.关闭不必要的插件 1.JVM虚拟机选项配置 -Xms128m -Xmx8192m -XX:ReservedCodeCacheSize1024m -XX:UseG1GC -XX:SoftRefLRUPolicyMSPerMB50 -XX:CICompilerCount2 -XX:HeapDumpOnOutOfMemoryError -XX:-Omi…

pytest之fixture结合conftest.py文件使用+断言实战

pytest之fixture结合conftest.py文件使用 conftest.py--存放固件固件的优先级pytest执行流程pytest之断言实战pytest结合allure-pytest插件生成美观的报告 conftest.py–存放固件 在一个项目的测试中&#xff0c;大多数情况下会有多个类、模块、或者包要使用相同的测试夹具。这…

kafka2.x版本配置SSL进行加密和身份验证

背景&#xff1a;找了一圈资料&#xff0c;都是东讲讲西讲讲&#xff0c;最后我还没搞好&#xff0c;最终决定参考官网说明。 官网指导手册地址&#xff1a;Apache Kafka 需要预备的知识&#xff0c;keytool和openssl 关于keytool的参考&#xff1a;keytool的使用-CSDN博客 …

Pytest测试框架+allure+jenkins自动化持续集成

Pytest是python的一种单元测试框架&#xff0c;可通过pytest 目录路径来运行测试用例 可以通过断言assert来测试是否通过 1.pytest测试用例命名规范 需严格遵循此规范&#xff0c;不然使用 pytest 目录 来运行会找不到该条测试用例。 可通过这样定义main函数&#xf…

Redis入门到实战-第二弹

Redis入门到实战 Redis安装官网地址Redis概述Redis-server安装Redis-stack-server使用(可选)Redisinsight安装(可选)更新计划 Redis安装 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://redis.io/Redis概述 Redis是…

LabVIEW焓差试验室流量计现场自动校准系统

LabVIEW焓差试验室流量计现场自动校准系统 在现代工业和科研领域&#xff0c;流量计的准确性对于保证生产过程的质量和效率非常重要。开发了一种基于LabVIEW的焓差试验室流量计现场自动校准系统&#xff0c;通过提高流量计校准的准确性和效率。 在空调器空气焓值法能效测量装…

java网络原理(二)------TCP确认应答和超时重传

一Tcp协议 TCP&#xff0c;即Transmission Control Protocol&#xff0c;传输控制协议。人如其名&#xff0c;要对数据的传输进行一个详细的控制。 二.TCP协议段格式 知道了端口号才能进一步确认这个数据报交给了哪一个程序。16为端口号是2字节&#xff0c;范围是0到65535.如…

redis功能点

一、redis简介 概述 Redis 是速度非常快的非关系型&#xff08;NoSQL&#xff09;内存键值数据库&#xff0c;可以存储键和五种不同类型的值之间的映射。键的类型只能为字符串&#xff0c;值支持五种数据类型&#xff1a;字符串、列表、集合、散列表、有序集合。 Redis 支持很…

windows端给python重命名,快速将默认的python修改为 python3

问题点 在windows上&#xff0c;我们实际已经安装了python&#xff0c;但默认的是 python, 可能有的程序执行需要用到 python3&#xff0c;下面的方法可以快速将默认的python修改为 python3 解决方法 此方法需要保证windows上已经安装了python 1&#xff1a;首先找到系统的…

LED显示屏视频播放器的8大功能

随着中国LED显示屏企业的规模发展和产品技术的不断创新&#xff0c;LED显示屏在各个领域中的应用得到了广泛推广。然而&#xff0c;LED显示屏的出色表现离不开LED视频播放器这一关键设备的支持。下面将介绍LED视频播放器的8大功能&#xff0c;以及它们如何提升LED显示屏的显像效…

FPGA - AXI4_Lite(实现用户端与axi4_lite之间的交互逻辑)

在之前的博客中对AXI4总线进行了介绍&#xff08;FPGA-AXI4接口协议概述&#xff09;&#xff0c;在这篇博客中&#xff0c;实现用户端与axi4_lite之间的交互逻辑。 一&#xff0c; AXI4 1.1 AXI4 介绍 对AXI4总线简单介绍&#xff08;具体可见FPGA-AXI4接口协议概述&#…

(done) 机器学习中的方差 variance 和 偏差 bias 怎么理解?

来源&#xff1a;https://blog.csdn.net/weixin_41479678/article/details/116230631 情况1属于&#xff1a;低 bias&#xff0c;高 variance (和 human performance 相近&#xff0c;但和 验证集dev set 相远) 通常意味着模型训练轮数太多 情况2属于&#xff1a;高 bias&#…

微服务高级篇(三):分布式缓存+Redis集群

文章目录 一、单点Redis的问题及解决方案二、Redis持久化2.1 单机安装Redis2.2 RDB持久化2.3 AOF持久化2.4 RDB和AOF对比 三、Redis主从3.1 搭建Redis主从架构3.1.1 集群结构3.1.2 准备实例和配置3.1.3 启动3.1.4 开启主从关系3.1.5 测试 3.2 数据同步3.2.1 全量同步【建立连接…