UNPKG

@mmote/niimblue-node

Version:

Headless clients for niimbluelib. Command line interface, simple REST server are also included.

73 lines (72 loc) 2.77 kB
"use strict"; 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;