UNPKG

fprint-r303t

Version:

Install:

161 lines (145 loc) 7.01 kB
//file for node 10.x version (using finaly function) const Jimp = require('jimp'); const fprint = require("bindings")("fingerprint") module.exports.getImage = async (timeout = 10000, binarize = false) => { if (fprint.init()) { try { var deviceHandle; var enrolStarted; return await new Promise((resolve, reject) => { let devices = fprint.discoverDevices(); if (devices.length > 0) { deviceHandle = fprint.openDevice(devices[0]); if (deviceHandle === null) { return reject(new Error('Failed to open device')); } else { console.log("Opened dev handle:" + deviceHandle); return resolve(deviceHandle); } } else { return reject(new Error('No supported devices found')); } }).then(async deviceHandle => { try { var stage = 1; return await new Promise((resolve, reject) => { var enrollTimeout = setTimeout(() => { reject('Enroll timeout') }, timeout); enrolStarted = fprint.enrollStart(deviceHandle, binarize, async (state, message, fingerprint, fingerprintImage, imgWidth, imgHeight) => { console.log("state " + state); if (state == 3) { console.log("stage " + stage++); clearTimeout(enrollTimeout); enrollTimeout = setTimeout(() => { reject('Enroll timeout') }, timeout); } else if (state == 1) { return resolve({ data: fingerprintImage, width: imgWidth, height: imgHeight }); } else if (state < 0 || state == 2) { return reject(new Error(message)); } }); }).catch(error => { console.log("Enroll failed with error:" + error.message); throw new Error(error); }) .finally(async () => { await new Promise((resolve, reject) => { if (enrolStarted) { console.log("Try to stop enroll"); setTimeout(function () { return reject('Enroll stop timeout') }, 1000); fprint.enrollStop(deviceHandle, () => { console.log("Enroll stopped - dev handle:" + deviceHandle); enrolStarted = false; return resolve(); }); } else { console.log("Nothing to stop - dev handle:" + deviceHandle); return resolve(); } }); }) .then( async function (rawImage) { console.log("RawImage done"); return await new Promise((resolve, reject) => { new Jimp(rawImage.width, rawImage.height, (err, image) => { if (err) { console.log("Jimp err:" + err); return reject(err); } if (binarize) sharpenPixels(image, rawImage); else setPixels(image, rawImage); console.log("Jimp done"); return resolve(image); }); }); } ); } finally { fprint.closeDevice(deviceHandle); } }).catch(error => { console.log("Get error:" + error.message); throw new Error(error); }); } finally { fprint.exit(); } } else { throw new Error('Initialization failed'); } }; module.exports.saveImage = async (path = './finger.png', timeout = 10000, binarize) => { let bitmap = await module.exports.getImage(timeout, binarize); bitmap.write(path); }; module.exports.getBMP = async (timeout, binarize) => { let image = await module.exports.getImage(timeout, binarize); image = await new Promise((resolve, reject) => image.getBuffer(Jimp.MIME_BMP, (err, buffer) => err ? reject(err) : resolve(buffer))); return image; } module.exports.getPNG = async (timeout, binarize) => { let image = await module.exports.getImage(timeout, binarize); image = await new Promise((resolve, reject) => image.getBuffer(Jimp.MIME_PNG, (err, buffer) => err ? reject(err) : resolve(buffer))); return image; } let setPixels = (image, raw) => { for (let y = 0; y < raw.height; y++) { for (let x = 0; x < raw.width; x++) { let color = raw.data[y * raw.width + x]; image.setPixelColor(Jimp.rgbaToInt(color, color, color, 255), x, y); } } } let sharpenPixels = (image, raw, treshold = 50, force = false, inerator = 0) => { let black = 0; let white = 0; if (!force) { for (let y = 0; y < raw.height; y++) { for (let x = 0; x < raw.width; x++) { if (raw.data[y * raw.width + x] >= treshold) white++; else black++; } } if (white == 0) return sharpenPixels(image, raw, treshold - 30, true, ++inerator); if ((black / white) > 2 && inerator < 10) return sharpenPixels(image, raw, treshold - 30, false, ++inerator); if ((black / white) < 0.8) return sharpenPixels(image, raw, treshold + 30, false, ++inerator); } for (let y = 0; y < raw.height; y++) { for (let x = 0; x < raw.width; x++) { let sharp = false; if (raw.data[y * raw.width + x] >= treshold) sharp = true; let color = sharp ? 255 : 0; let alpha = sharp ? 0 : 255; image.setPixelColor(Jimp.rgbaToInt(color, color, color, alpha), x, y); } } }