|
|
|
const path = require('path')
|
|
|
|
const fetch = require('node-fetch')
|
|
|
|
const isURL = require('is-url')
|
|
|
|
|
|
|
|
exports.defaultOptions = {
|
|
|
|
workerPath: path.join(__dirname, 'worker.js'),
|
|
|
|
langPath: 'http://cdn.rawgit.com/naptha/tessdata/gh-pages/3.02/',
|
|
|
|
}
|
|
|
|
|
|
|
|
const fork = require('child_process').fork;
|
|
|
|
const fs = require('fs')
|
|
|
|
|
|
|
|
exports.spawnWorker = function spawnWorker(instance, workerOptions){
|
|
|
|
var cp = fork(workerOptions.workerPath);
|
|
|
|
cp.on('message', function(packet){
|
|
|
|
instance._recv(packet)
|
|
|
|
})
|
|
|
|
return cp;
|
|
|
|
}
|
|
|
|
|
|
|
|
exports.terminateWorker = function(instance){
|
|
|
|
instance.worker.kill()
|
|
|
|
}
|
|
|
|
|
|
|
|
exports.sendPacket = function sendPacket(instance, packet){
|
|
|
|
loadImage(packet.payload.image, function(img){
|
|
|
|
packet.payload.image = img
|
|
|
|
instance.worker.send(packet)
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function loadImage(image, cb){
|
|
|
|
|
|
|
|
if(isURL(image)) {
|
|
|
|
fetch(image).then(function (resp) {
|
|
|
|
return resp.buffer();
|
|
|
|
}).then(function (buffer) {
|
|
|
|
return loadImage(buffer, cb);
|
|
|
|
}).catch(function (err) {
|
|
|
|
return console.error(err);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
if(typeof image === 'string'){
|
|
|
|
fs.readFile(image, function(err, buffer){
|
|
|
|
if (err) throw err;
|
|
|
|
loadImage(buffer, cb)
|
|
|
|
})
|
|
|
|
return
|
|
|
|
}else if(image instanceof Buffer){
|
|
|
|
var fileType = require('file-type');
|
|
|
|
var mime = fileType(image).mime
|
|
|
|
|
|
|
|
if(mime === 'image/png'){
|
|
|
|
var PNGReader = require('png.js');
|
|
|
|
var reader = new PNGReader(image);
|
|
|
|
reader.parse(function(err, png){
|
|
|
|
if (err) throw err;
|
|
|
|
|
|
|
|
var image = {
|
|
|
|
width: png.getWidth(),
|
|
|
|
height: png.getHeight()
|
|
|
|
}
|
|
|
|
image.data = new Uint8Array(image.width * image.height * 4)
|
|
|
|
for(var j = 0; j < image.height; j++){
|
|
|
|
for(var i = 0; i < image.width; i++){
|
|
|
|
var offset = 4 * (i + j * image.width),
|
|
|
|
pix = png.getPixel(i, j);
|
|
|
|
|
|
|
|
image.data[offset] = pix[0]
|
|
|
|
image.data[offset + 1] = pix[1]
|
|
|
|
image.data[offset + 2] = pix[2]
|
|
|
|
image.data[offset + 3] = pix[3];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// console.log(image)
|
|
|
|
loadImage(image, cb)
|
|
|
|
});
|
|
|
|
return
|
|
|
|
}else if(mime === 'image/jpeg'){
|
|
|
|
var jpeg = require('jpeg-js');
|
|
|
|
loadImage(jpeg.decode(image), cb)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// TODO: support for TIFF, NetPBM, BMP, etc.
|
|
|
|
}
|
|
|
|
|
|
|
|
// node uses json.stringify for ipc which means we need to turn
|
|
|
|
// fancy arrays into raw arrays
|
|
|
|
if(image && image.data && image.data.length && !Array.isArray(image.data)){
|
|
|
|
image.data = Array.from(image.data)
|
|
|
|
return loadImage(image, cb)
|
|
|
|
}
|
|
|
|
cb(image)
|
|
|
|
}
|