Jerome Wu
6 years ago
4 changed files with 131 additions and 116 deletions
@ -1,89 +1,96 @@ |
|||||||
const fetch = require('isomorphic-fetch'), |
const check = require('check-types'); |
||||||
isURL = require('is-url'), |
const fetch = require('isomorphic-fetch'); |
||||||
fork = require('child_process').fork, |
const isURL = require('is-url'); |
||||||
fs = require('fs'); |
const { fork } = require('child_process'); |
||||||
|
const fs = require('fs'); |
||||||
|
const path = require('path'); |
||||||
|
const fileType = require('file-type'); |
||||||
|
const PNGReader = require('png.js'); |
||||||
|
const JPGReader = require('jpeg-js'); |
||||||
|
|
||||||
exports.defaultOptions = { |
function loadImage(image, cb) { |
||||||
workerPath: require('path').join(__dirname, 'worker.js'), |
if (check.string(image)) { |
||||||
langPath: 'https://cdn.jsdelivr.net/gh/naptha/tessdata@gh-pages/4.0.0/', |
if (isURL(image)) { |
||||||
} |
fetch(image) |
||||||
|
.then(resp => resp.buffer()) |
||||||
exports.spawnWorker = function spawnWorker(instance, workerOptions){ |
.then(buffer => loadImage(buffer, cb)) |
||||||
var cp = fork(workerOptions.workerPath); |
.catch(err => console.error(err)); |
||||||
cp.on('message', packet => { |
} else { |
||||||
instance._recv(packet); |
fs.readFile(image, (err, buffer) => { |
||||||
}); |
if (err) throw err; |
||||||
return cp; |
loadImage(buffer, cb); |
||||||
} |
}); |
||||||
|
} |
||||||
exports.terminateWorker = function(instance){ |
return; |
||||||
instance.worker.kill(); |
} |
||||||
} |
if (image instanceof Buffer) { |
||||||
|
const { mime } = fileType(image); |
||||||
|
|
||||||
exports.sendPacket = function sendPacket(instance, packet){ |
if (mime === 'image/png') { |
||||||
loadImage(packet.payload.image, img => { |
const reader = new PNGReader(image); |
||||||
packet.payload.image = img; |
reader.parse((err, png) => { |
||||||
instance.worker.send(packet); |
if (err) throw err; |
||||||
}); |
|
||||||
} |
|
||||||
|
|
||||||
|
const width = png.getWidth(); |
||||||
|
const height = png.getHeight(); |
||||||
|
const data = new Uint8Array(width * height * 4); |
||||||
|
|
||||||
function loadImage(image, cb){ |
for (let j = 0; j < height; j += 1) { |
||||||
|
for (let i = 0; i < width; i += 1) { |
||||||
|
const offset = 4 * (i + (j * width)); |
||||||
|
const pix = png.getPixel(i, j); |
||||||
|
|
||||||
if(typeof image === 'string'){ |
Array(4).fill(0).forEach((v, idx) => { |
||||||
if (isURL(image)) { |
data[offset + idx] = pix[idx]; |
||||||
fetch(image) |
|
||||||
.then(resp => resp.buffer()) |
|
||||||
.then(buffer => loadImage(buffer, cb)) |
|
||||||
.catch(err => console.error(err)); |
|
||||||
} else { |
|
||||||
fs.readFile(image, function(err, buffer){ |
|
||||||
if (err) throw err; |
|
||||||
loadImage(buffer, cb); |
|
||||||
}); |
}); |
||||||
|
} |
||||||
} |
} |
||||||
return; |
loadImage({ width, height, data }, cb); |
||||||
} else if (image instanceof Buffer){ |
}); |
||||||
var mime = require('file-type')(image).mime |
return; |
||||||
|
} |
||||||
|
if (mime === 'image/jpeg') { |
||||||
|
loadImage(JPGReader.decode(image), cb); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
if(mime === 'image/png'){ |
// TODO: support for TIFF, NetPBM, BMP, etc.
|
||||||
var PNGReader = require('png.js'); |
} |
||||||
var reader = new PNGReader(image); |
|
||||||
reader.parse(function(err, png){ |
|
||||||
if (err) throw err; |
|
||||||
|
|
||||||
var image = { |
// node uses json.stringify for ipc which means we need to turn
|
||||||
width: png.getWidth(), |
// fancy arrays into raw arrays
|
||||||
height: png.getHeight() |
if (image && image.data && image.data.length && !Array.isArray(image.data)) { |
||||||
} |
loadImage({ ...image, data: Array.from(image.data) }, cb); |
||||||
image.data = new Uint8Array(image.width * image.height * 4) |
return; |
||||||
for(var j = 0; j < image.height; j++){ |
} |
||||||
for(var i = 0; i < image.width; i++){ |
cb(image); |
||||||
var offset = 4 * (i + j * image.width), |
} |
||||||
pix = png.getPixel(i, j); |
|
||||||
|
|
||||||
image.data[offset] = pix[0]; |
exports.defaultOptions = { |
||||||
image.data[offset + 1] = pix[1]; |
workerPath: path.join(__dirname, 'worker.js'), |
||||||
image.data[offset + 2] = pix[2]; |
langPath: 'https://cdn.jsdelivr.net/gh/naptha/tessdata@gh-pages/4.0.0/', |
||||||
image.data[offset + 3] = pix[3]; |
}; |
||||||
} |
|
||||||
} |
|
||||||
loadImage(image, cb); |
|
||||||
}); |
|
||||||
return; |
|
||||||
} else if (mime === 'image/jpeg'){ |
|
||||||
loadImage(require('jpeg-js').decode(image), cb); |
|
||||||
return; |
|
||||||
} |
|
||||||
|
|
||||||
// TODO: support for TIFF, NetPBM, BMP, etc.
|
exports.spawnWorker = (instance, { workerPath }) => { |
||||||
} |
const cp = fork(workerPath); |
||||||
|
cp.on('message', (packet) => { |
||||||
|
instance._recv(packet); |
||||||
|
}); |
||||||
|
return cp; |
||||||
|
}; |
||||||
|
|
||||||
// node uses json.stringify for ipc which means we need to turn
|
exports.terminateWorker = (instance) => { |
||||||
// fancy arrays into raw arrays
|
instance.worker.kill(); |
||||||
if(image && image.data && image.data.length && !Array.isArray(image.data)){ |
}; |
||||||
image.data = Array.from(image.data); |
|
||||||
return loadImage(image, cb) |
exports.sendPacket = (instance, packet) => { |
||||||
} |
loadImage(packet.payload.image, (img) => { |
||||||
cb(image); |
instance.worker.send({ |
||||||
} |
...packet, |
||||||
|
payload: { |
||||||
|
...packet.payload, |
||||||
|
image: img, |
||||||
|
}, |
||||||
|
}); |
||||||
|
}); |
||||||
|
}; |
||||||
|
Loading…
Reference in new issue