底图地址
https://static.geetest.com/pictures/gt/cd0bbb6fe/bg/a1152167f.webp
原始代码
function $_BEB(t, e) {
var $_DAHHD = mwbxQ.$_DW()[3][13];
for (; $_DAHHD !== mwbxQ.$_DW()[9][11]; ) {
switch ($_DAHHD) {
case mwbxQ.$_DW()[6][13]:
t = t[$_CJFt(52)],
e = e[$_CJES(52)];
var n = t[$_CJES(18)]
, r = t[$_CJFt(77)]
, i = h[$_CJES(50)]($_CJFt(16));
i[$_CJES(18)] = n,
i[$_CJES(77)] = r;
var o = i[$_CJFt(55)]($_CJES(68));
$_DAHHD = mwbxQ.$_DW()[6][12];
break;
case mwbxQ.$_DW()[9][12]:
o[$_CJFt(64)](t, 0, 0);
var s = e[$_CJES(55)]($_CJFt(68));
e[$_CJFt(77)] = r,
e[$_CJFt(18)] = 260;
for (var a = r / 2, _ = 0; _ < 52; _ += 1) {
var c = Ut[_] % 26 * 12 + 1
, u = 25 < Ut[_] ? a : 0
, l = o[$_CJES(34)](c, u, 10, a);
s[$_CJFt(49)](l, _ % 26 * 10, 25 < _ ? a : 0);
}
$_DAHHD = mwbxQ.$_DW()[0][11];
break;
}
}
}
### 精简代码
```javascript
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]
t = t[$_CJFt(52)], //原始图像
e = e[$_CJES(52)]; //放在画布中的缩放图像
var n = t["width"]//312
, r = t["height"]//160
, i = h["createElement"]("canvas");//创建 Canvas 对象
i["width"] = n,//312
i["height"] = r;//160
var o = i["getContext"]("2d");
o["drawImage"](t, 0, 0);//向画布上绘制图像 参数1:规定要使用的图像 参数2:开始剪切的 x 坐标位置。参数3:开始剪切的 y 坐标位置。
var s = e["getContext"]("2d");
e["height"] = r,
e["width"] = 260;
for (var a = r / 2, _ = 0; _ < 52; _ += 1) {
var c = Ut[_] % 26 * 12 + 1 //%26可以判断上下,然后*12+1计算出x轴坐标
, u = 25 < Ut[_] ? a : 0 //如果比25要大,y轴坐标就80,下半部分,0就是上半部分
, l = o["getImageData"](c, u, 10, a); //返回ImageData对象,该对象为画布上指定的矩形复制像素数据。参数1:开始复制的左上角位置的x坐标 参数2:开始复制的左上角位置的 y 坐标 参数3:要复制的矩形区域的宽度。参数4:要复制的矩形区域的高度。
s["putImageData"](l, _ % 26 * 10, 25 < _ ? a : 0);//把图像数据放回画布上 imgData 参数1:规定要放回画布的 ImageData 对象。参数2:ImageData 对象左上角的 x 坐标,以像素计。参数3:ImageData 对象左上角的 y 坐标,以像素计。
}
还原py代码
from PIL import Image
import cv2
import numpy as np
from pathlib import Path
def Bg_Reduction(bg_path):
image=Image.open(bg_path)
New_Image=Image.new('RGBA',(260,160))
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]
for index in range(52):
c = Ut[index] % 26 * 12 + 1
u = 80 if Ut[index] > 25 else 0
l=image.crop(box=(c, u, c+10, u+80))
New_Image.paste(l,( index% 26 * 10, 80 if 25 < index else 0))
with open('new_bg.png','wb') as f:
New_Image.save(f,'png')
def bytes_to_cv2(img):
"""
二进制图片转cv2
:param img: 二进制图片数据, <type 'bytes'>
:return: cv2图像, <type 'numpy.ndarray'>
"""
# 将图片字节码bytes, 转换成一维的numpy数组到缓存中
img_buffer_np = np.frombuffer(img, dtype=np.uint8)
# 从指定的内存缓存中读取一维numpy数据, 并把数据转换(解码)成图像矩阵格式
img_np = cv2.imdecode(img_buffer_np, 1)
return img_np
def cv2_open(img, flag=None):
"""
统一输出图片格式为cv2图像, <type 'numpy.ndarray'>
:param img: <type 'bytes'/'numpy.ndarray'/'str'/'Path'/'PIL.JpegImagePlugin.JpegImageFile'>
:param flag: 颜色空间转换类型, default: None
eg: cv2.COLOR_BGR2GRAY(灰度图)
:return: cv2图像, <numpy.ndarray>
"""
if isinstance(img, bytes):
img = bytes_to_cv2(img)
elif isinstance(img, (str, Path)):
img = cv2.imread(str(img))
elif isinstance(img, np.ndarray):
img = img
elif isinstance(img, Image):
img = cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)
else:
raise ValueError(f'输入的图片类型无法解析: {type(img)}')
if flag is not None:
img = cv2.cvtColor(img, flag)
return img
def get_distance(bg, tp):
"""
:param bg: 背景图路径或Path对象或图片二进制
:param tp: 缺口图路径或Path对象或图片二进制
:return: 缺口位置
"""
# 读取图片
bg_gray = cv2_open(bg)
tp_gray = cv2_open(tp, flag=cv2.COLOR_BGR2GRAY)
# 转换图片大小,网页上面是的参数跟返回的参数是不一样的
bg_gray = cv2.resize(bg_gray, dsize=(260, 160))
tp_gray = cv2.resize(tp_gray, dsize=(55, 54))
# 边缘检测
tp_gray = cv2.Canny(tp_gray, 255, 255)
bg_gray = cv2.Canny(bg_gray, 255, 255)
# 目标匹配
result = cv2.matchTemplate(bg_gray, tp_gray, cv2.TM_CCOEFF_NORMED)
# 解析匹配结果
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
distance = max_loc[0]
return distance
Bg_Reduction('bg.png')
print(get_distance('new_bg.png', 'tp.png'))