escpos
Version:
ESC/POS Printer driver for nodejs
156 lines (133 loc) • 3.16 kB
JavaScript
'use strict';
const getPixels = require('get-pixels');
/**
* [Image description]
* @param {[type]} pixels [description]
*/
function Image(pixels){
if(!(this instanceof Image))
return new Image(pixels);
this.pixels = pixels;
this.data = [];
function rgb(pixel) {
return {
r: pixel[0],
g: pixel[1],
b: pixel[2],
a: pixel[3]
};
};
var self = this;
for(var i=0;i<this.pixels.data.length;i+=this.size.colors){
this.data.push(rgb(new Array(this.size.colors).fill(0).map(function(_, b){
return self.pixels.data[ i + b ];
})));
};
this.data = this.data.map(function(pixel) {
if (pixel.a == 0) return 0;
var shouldBeWhite = pixel.r > 200 && pixel.g > 200 && pixel.b > 200;
return shouldBeWhite ? 0 : 1;
});
};
/**
* [load description]
* @param {[type]} url [description]
* @param {[type]} type [description]
* @param {Function} callback [description]
* @return {[type]} [description]
*/
Image.load = function(url, type, callback){
if(typeof type == 'function'){
callback = type;
type = null;
}
getPixels(url, type, function(err, pixels){
if(err) return callback(err);
callback(new Image(pixels));
});
};
/**
* [description]
* @return {[type]} [description]
*/
Image.prototype.__defineGetter__('size', function(){
return {
width : this.pixels.shape[0],
height: this.pixels.shape[1],
colors: this.pixels.shape[2],
};
});
/**
* [toBitmap description]
* @param {[type]} density [description]
* @return {[type]} [description]
*/
Image.prototype.toBitmap = function(density) {
density = density || 24;
var ld, result = [];
var x, y, b, l, i;
var c = density / 8;
// n blocks of lines
var n = Math.ceil(this.size.height / density);
for (y = 0; y < n; y++) {
// line data
ld = result[y] = [];
for (x = 0; x < this.size.width; x++) {
for (b = 0; b < density; b++) {
i = x * c + (b >> 3);
if (ld[i] === undefined) {
ld[i] = 0;
}
l = y * density + b;
if (l < this.size.height) {
if (this.data[l * this.size.width + x]) {
ld[i] += (0x80 >> (b & 0x7));
}
}
}
}
}
return {
data: result,
density: density
};
};
/**
* [toRaster description]
* @return {[type]} [description]
*/
Image.prototype.toRaster = function () {
var result = [];
var width = this.size.width;
var height = this.size.height;
var data = this.data;
// n blocks of lines
var n = Math.ceil(width / 8);
var x, y, b, c, i;
for (y = 0; y < height; y++) {
for (x = 0; x < n; x++) {
for (b = 0; b < 8; b++) {
i = x * 8 + b;
if (result[y * n + x] === undefined) {
result[y * n + x] = 0;
}
c = x * 8 + b;
if (c < width) {
if (data[y * width + i]) {
result[y * n + x] += (0x80 >> (b & 0x7));
}
}
}
}
}
return {
data: result,
width: n,
height: height
};
}
/**
* [exports description]
* @type {[type]}
*/
module.exports = Image;