# -*- coding: utf-8 -*-
import io
from pathlib import Path
from PIL import Image
def parse_bg_captcha(img, im_show=False, save_path=None):
if isinstance(img, (str, Path)):
_img = Image.open(img)
elif isinstance(img, bytes):
_img = Image.open(io.BytesIO(img))
else:
raise ValueError(f'输入图片类型错误, 必须是<type str>/<type Path>/<type bytes>: {type(img)}')
# 图片还原顺序, 定值
_Ge = [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]
w_sep, h_sep = 10, 80
# 还原后的背景图
new_img = Image.new('RGB', (260, 160))
for idx in range(len(_Ge)):
x = _Ge[idx] % 26 * 12 + 1
y = h_sep if _Ge[idx] > 25 else 0
# 从背景图中裁剪出对应位置的小块
img_cut = _img.crop((x, y, x + w_sep, y + h_sep))
print(img_cut)
# 将小块拼接到新图中
new_x = idx % 26 * 10
new_y = h_sep if idx > 25 else 0
new_img.paste(img_cut, (new_x, new_y))
save_path = Path(save_path).resolve().__str__()
new_img.save(save_path)
return new_img
if __name__ == '__main__':
parse_bg_captcha("bg.webp", im_show=True, save_path='bg.jpg')
转义成node.js 使用sharp
const sharp = require('sharp');//https://sharp.pixelplumbing.com/api-constructor#clone
async function parse_bg_captcha(img, im_show = false, save_path = null) {
let _img = sharp(img);
let { width,height} = await _img.metadata();
`
let bg = _img.extract({ left: 100, top: 100, width: 100, height: 100 });
bg.toFile(save_path); return;
console.log(save_path)
_img.toFile(save_path); return;`
let _Ge=[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];
let [w_sep, h_sep] = [10, 80];
let new_img = sharp({
create: {
width: 260,
height: 160,
channels: 3,
background: { r: 255, g: 255, b: 255 }
}
});
let paste = [];
for (let idx = 0; idx < _Ge.length; idx++) {
let x = _Ge[idx] % 26 * 12 + 1;
let y = _Ge[idx] > 25 ? h_sep : 0;
let data = { left: x, top: y, width: w_sep, height: h_sep };
let img_cut;
try {
img_cut = await _img.clone().extract(data).toBuffer();
}
catch (e) {
console.log(e, '==>', data);
continue
}
let new_x = idx % 26 * 10
let new_y = idx > 25 ? h_sep : 0;
paste.push({ input: img_cut, left: new_x, top: new_y });
}
await new_img.composite(paste).toFile(save_path)
}
parse_bg_captcha('bg.webp',false ,'bg.jpg')
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!