|
|
@ -14,12 +14,13 @@ const gm = require('gm').subClass({ imageMagick: true }) |
|
|
|
} while (g > div * mod - 1); |
|
|
|
} while (g > div * mod - 1); |
|
|
|
return ((g / div) | 0) + min; |
|
|
|
return ((g / div) | 0) + min; |
|
|
|
} |
|
|
|
} |
|
|
|
, crop = 30 |
|
|
|
, padding = 30 |
|
|
|
, width = captchaOptions.imageSize+crop |
|
|
|
, width = captchaOptions.imageSize+padding |
|
|
|
, height = captchaOptions.imageSize+crop |
|
|
|
, height = captchaOptions.imageSize+padding |
|
|
|
, gridSize = captchaOptions.gridSize |
|
|
|
, gridSize = captchaOptions.gridSize |
|
|
|
, zeros = ['○','□','♘','♢','▽','△','♖','✧','♔','♘','♕','♗','♙','♧'] |
|
|
|
, zeros = ['○','□','♘','♢','▽','△','♖','✧','♔','♘','♕','♗','♙','♧'] |
|
|
|
, ones = ['●','■','♞','♦','▼','▲','♜','✦','♚','♞','♛','♝','♟','♣'] |
|
|
|
, ones = ['●','■','♞','♦','▼','▲','♜','✦','♚','♞','♛','♝','♟','♣'] |
|
|
|
|
|
|
|
, colors = ['#FF8080', '#80FF80', '#8080FF', '#FF80FF', '#FFFF80', '#80FFFF'] |
|
|
|
|
|
|
|
|
|
|
|
module.exports = async () => { |
|
|
|
module.exports = async () => { |
|
|
|
//number of inputs in grid
|
|
|
|
//number of inputs in grid
|
|
|
@ -52,25 +53,26 @@ module.exports = async () => { |
|
|
|
.fill('#000000') |
|
|
|
.fill('#000000') |
|
|
|
.font(__dirname+'/../font.ttf'); |
|
|
|
.font(__dirname+'/../font.ttf'); |
|
|
|
|
|
|
|
|
|
|
|
const spaceSize = (width-crop)/gridSize; |
|
|
|
const spaceSize = (width-padding)/gridSize; |
|
|
|
for(let i = 0, j = 0; i < boolArray.length; i++) { |
|
|
|
for(let j = 0; j < gridSize; j++) { |
|
|
|
if (i % gridSize === 0) { j++ } |
|
|
|
let cxOffset = await randomRange(0, spaceSize*1.5); |
|
|
|
const cxOffset = await randomRange(0, spaceSize*0.75); |
|
|
|
for(let i = 0; i < gridSize; i++) { |
|
|
|
const cyOffset = await randomRange(spaceSize/2, spaceSize); |
|
|
|
const index = (j*gridSize)+i; |
|
|
|
const charIndex = await randomRange(0, ones.length-1); |
|
|
|
const cyOffset = await randomRange(0, spaceSize/2); |
|
|
|
const character = (boolArray[i] ? ones : zeros)[charIndex]; |
|
|
|
const charIndex = await randomRange(0, ones.length-1); |
|
|
|
captcha.fontSize((await randomRange(20,30))) |
|
|
|
const character = (boolArray[index] ? ones : zeros)[charIndex]; |
|
|
|
captcha.drawText( |
|
|
|
captcha.fontSize((await randomRange(20,30))) |
|
|
|
(spaceSize*(i%gridSize))+cxOffset+(crop/2), |
|
|
|
captcha.drawText( |
|
|
|
(spaceSize*(j-1))+cyOffset+(crop/2), |
|
|
|
spaceSize*(i)+cxOffset, |
|
|
|
character |
|
|
|
spaceSize*(j+1)+cyOffset, |
|
|
|
); |
|
|
|
character |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
captcha |
|
|
|
captcha |
|
|
|
.distort(distorts, 'Shepards') |
|
|
|
.distort(distorts, 'Shepards') |
|
|
|
.edge(25) |
|
|
|
.edge(5) |
|
|
|
// .quality(10)
|
|
|
|
|
|
|
|
.crop(captchaOptions.imageSize,captchaOptions.imageSize,crop/2,crop/2) |
|
|
|
|
|
|
|
.write(`${uploadDirectory}/captcha/${captchaId}.jpg`, (err) => { |
|
|
|
.write(`${uploadDirectory}/captcha/${captchaId}.jpg`, (err) => { |
|
|
|
if (err) { |
|
|
|
if (err) { |
|
|
|
return reject(err); |
|
|
|
return reject(err); |
|
|
|