Node 生成验证码 - imageMagick

imageMagick 安装

官网下载页下载,安装完成后得到 convert 命令。若是 Mac,可以直接使用下面的命令

brew install imagemagick

生成一个验证码

$ convert -size 290x70 xc:white -bordercolor black -border 5 \
-fill black -stroke black -strokewidth 1 -font TimesNewRoman -pointsize 40 \
-draw "translate -116,-5 skewX 37 gravity center text 0,0 'a'" \
-draw "translate -73,-4 skewX -20 gravity center text 0,0 's'" \
-draw "translate -26,8 skewX 28 gravity center text 0,0 'd'" \
-draw "translate 27,5 skewX 27 gravity center text 0,0 'f'" \
-draw "translate 75,-3 skewX -7 gravity center text 0,0 'q'" \
-draw "translate 118,7 skewX 36 gravity center text 0,0 'k'" \
-fill none -strokewidth 5 \
-draw "bezier 22.4,58 68.6,56 129.1,50 180.8,58" \
-draw "polyline 174.2,58 234.7,38 280.9,56" \
-resize 100% \
./test.jpg

Node 执行下列命令来生成一张验证码

const exec = require('child_process').exec;

const command = `
convert -size 290x70 xc:white -bordercolor black -border 5 \
-fill black -stroke black -strokewidth 1 -font TimesNewRoman -pointsize 40 \
-draw "translate -116,-5 skewX 37 gravity center text 0,0 'a'" \
-draw "translate -73,-4 skewX -20 gravity center text 0,0 's'" \
-draw "translate -26,8 skewX 28 gravity center text 0,0 'd'" \
-draw "translate 27,5 skewX 27 gravity center text 0,0 'f'" \
-draw "translate 75,-3 skewX -7 gravity center text 0,0 'q'" \
-draw "translate 118,7 skewX 36 gravity center text 0,0 'k'" \
-fill none -strokewidth 5 \
-draw "bezier 22.4,58 68.6,56 129.1,50 180.8,58" \
-draw "polyline 174.2,58 234.7,38 280.9,56" \
-resize 100% \
./test.jpg
`;

new Promise((resolve, reject) => {
  exec(command, function(err) {
    if (err) {
      reject(err);
    }
    resolve({
      code: text,
      path: url,
    });
  });
});

生成一张交错的黑白交错的网格背景

生成一个张黑白交错的网格背景,并且平铺它。

$ convert -size 20x20 xc:white  \
-fill black \
-draw "rectangle 0,0 10,10 rectangle 10,10 20,20" \
./bg.jpg

$ composite -tile bg.jpg -size 290x70  xc:none  test.jpg

在某张背景图上写入验证码文字

$ convert -size 290x70 -strip xc:none ./test.jpg -gravity center  \
-composite \
-bordercolor black -border 5 \
-fill transparent -stroke black -strokewidth 1 \
-font Verdana -pointsize 50 \
-draw "translate -73,-6 skewX -3 gravity center text 0,0 '5'" \
-draw "translate -49,-4 skewX 16 gravity center text 0,0 '3'" \
-draw "translate -11,-7 skewX 23 gravity center text 0,0 '9'" \
-draw "translate 18,8 skewX 7 gravity center text 0,0 '3'" \
-draw "translate 47,-5 skewX -20 gravity center text 0,0 '6'" \
-draw "translate 77,-6 skewX -8 gravity center text 0,0 '4'" \
-fill none -stroke black -strokewidth 5  \
-draw "bezier 65,28 91,32 133,26"  \
-draw "polyline 133,26 165,56 212,30 245,28" \
./test_text.jpg

灰度化

convert in.png -grayscale Rec709Luma gray.png

Rec709Luma 是一种灰度算法。

二值化

常用于破解验证码,提交给 OCR 识别

# 若用原图
convert in.png -monochrome out.png

# 若用灰度图,threshold代表二值化程度
convert gray.png -threshold 55%  gray_out.png

参考

imageMagick 官方文档

Fred's ImageMagick Scripts

posted @ 2020-05-07 10:57  Ever-Lose  阅读(529)  评论(0编辑  收藏  举报