# -*- 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)) if im_show: new_img.show() if save_path is not None: 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编写一份
时间: 2023-11-25 21:05:21 浏览: 27
以下是Node.js版本的代码,实现了与Python代码相同的功能:
```javascript
const fs = require('fs');
const { createCanvas, loadImage } = require('canvas');
async function parseBgCaptcha(imgPath, imShow = false, savePath = null) {
const canvas = createCanvas(260, 160);
const ctx = canvas.getContext('2d');
const img = await loadImage(imgPath);
ctx.drawImage(img, 0, 0);
const 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
];
const wSep = 10, hSep = 80;
const newCanvas = createCanvas(260, 160);
const newCtx = newCanvas.getContext('2d');
for (let idx = 0; idx < ge.length; idx++) {
const x = ge[idx] % 26 * 12 + 1;
const y = ge[idx] > 25 ? hSep : 0;
const imgData = ctx.getImageData(x, y, wSep, hSep);
newCtx.putImageData(imgData, idx % 26 * 10, ge[idx] > 25 ? hSep : 0);
}
if (imShow) {
const imShowCanvas = createCanvas(260, 160);
const imShowCtx = imShowCanvas.getContext('2d');
imShowCtx.drawImage(newCanvas, 0, 0);
const buffer = imShowCanvas.toBuffer('image/png');
fs.writeFileSync('bg.png', buffer);
}
if (savePath !== null) {
const buffer = newCanvas.toBuffer('image/jpeg');
fs.writeFileSync(savePath, buffer);
}
return newCanvas;
}
if (require.main === module) {
parseBgCaptcha('bg.webp', true, 'bg.jpg');
}
```
注意,这里使用了Canvas API代替了Python中的PIL库。另外,由于Node.js中没有提供像Python中的PIL库中的`crop`方法,因此我们使用`getImageData`和`putImageData`方法来实现同样的功能。