@mmote/niimblue-node
Version:
Headless clients for niimbluelib. Command line interface, simple REST server are also included.
73 lines (72 loc) • 2.77 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ImageEncoder = void 0;
const niimbluelib_1 = require("@mmote/niimbluelib");
class ImageEncoder {
static async encodeImage(src, printDirection = "left") {
const rowsData = [];
const { data, info } = await src
.flatten({ background: "#fff" })
.toColorspace("b-w")
.raw()
.toBuffer({ resolveWithObject: true });
let cols = info.width;
let rows = info.height;
if (printDirection === "left") {
cols = info.height;
rows = info.width;
}
if (cols % 8 !== 0) {
throw new Error("Column count must be multiple of 8");
}
for (let row = 0; row < rows; row++) {
let isVoid = true;
let blackPixelsCount = 0;
const rowData = new Uint8Array(cols / 8);
for (let colOct = 0; colOct < cols / 8; colOct++) {
let pixelsOctet = 0;
for (let colBit = 0; colBit < 8; colBit++) {
if (ImageEncoder.isPixelNonWhite(data, info.width, info.height, colOct * 8 + colBit, row, printDirection)) {
pixelsOctet |= 1 << (7 - colBit);
isVoid = false;
blackPixelsCount++;
}
}
rowData[colOct] = pixelsOctet;
}
const newPart = {
dataType: isVoid ? "void" : "pixels",
rowNumber: row,
repeat: 1,
rowData: isVoid ? undefined : rowData,
blackPixelsCount,
};
// Check previous row and increment repeats instead of adding new row if data is same
if (rowsData.length === 0) {
rowsData.push(newPart);
}
else {
const lastPacket = rowsData[rowsData.length - 1];
let same = newPart.dataType === lastPacket.dataType;
if (same && newPart.dataType === "pixels") {
same = niimbluelib_1.Utils.u8ArraysEqual(newPart.rowData, lastPacket.rowData);
}
if (same) {
lastPacket.repeat++;
}
else {
rowsData.push(newPart);
}
}
}
return { cols, rows, rowsData };
}
static isPixelNonWhite(buf, imgWidth, imgHeight, x, y, printDirection = "left") {
let idx = y * imgWidth + x;
if (printDirection === "left") {
idx = (imgHeight - 1 - x) * imgWidth + y;
}
return buf.at(idx) !== 0xff;
}
}
exports.ImageEncoder = ImageEncoder;