Я нашел хорошее решение, отработав этот пример кода: rephrase.net / box / bitmap Автор помог мне реализовать функцию, которая могла бы превратить массив пикселей в монохромное растровое изображение.Оттуда я смог взять данные холста, выполнить итерацию по ним и проанализировать их в массив пикселей, который я мог преобразовать в монохромный BMP.
Я создал эту функцию, чтобы облегчить преобразование данных холста на основе альфа-значений (так какданные холста в моем приложении также монохромные) в массив пикселей, который может использоваться сценарием jsbmp:
function createBMP(canvas) {
var context = canvas.getContext("2d");
var width = canvas.width;
var height = canvas.height;
var imageData = context.getImageData(0, 0, width, height);
var data = imageData.data;
//create pixel array from canvas based on alpha
var pixels = [];
for (var i = data.length - 1; i > 0; i -= 4) {
if (i > 0) {
if (data[i] > 125) {
pixels.push("000000");
} else {
pixels.push("ffffff");
}
}
}
//unmirror
var pixarray = [];
for (var i = height - 1; i > -1; i--) {
var row = [];
for (var j = 0; j < width; j++) {
row.push(pixels[(i * width) + j]);
}
for (var j in row) {
pixarray.push(row[j]);
}
}
pixarray.reverse();
return bmp_mono(width, height, pixarray);
}
А вот код для bmp_mono:
/*
Create an uncompressed Windows bitmap (monochrome) given width, height and an
array of pixels.
Pixels should be in BMP order, i.e. starting at the bottom left, going up
one row at a time.
*/
function bmp_mono(width, height, pixarray, palette) {
var rowsize = Math.ceil(width / 8);
var rowpadding = 4 - (rowsize % 4);
if (typeof palette == 'undefined')
palette = ['000000', 'ffffff'];
var j, pix, mod;
pixarray.reverse();
var pixels = [];
var b = 0;
for (var i=0; i<height; ++i) {
row = [];
for (j=0; j<width; ++j) {
mod = j % 8;
pix = pixarray.pop();
if (parseInt(pix, 16) != 0) {
b = b | Math.pow(2, 7-mod);
}
if (mod == 7 || j == width-1) {
pixels.push(String.fromCharCode(b));
b = 0;
}
}
for (j=0; j<rowpadding; ++j) {
pixels.push("\x00");
}
}
return _bmp(width, height, palette, pixels.join(""), 1, 0);
}