to_bw = function(image, size, normalize, color) {
const c = copy(image, size, size)
const image_data = c.getImageData(0, 0, size, size).data
const new_image_data = new Uint8ClampedArray(size * size * 4)
const alpha = new Float32Array(size * size)
let img_offset = 0
for (let i = 0; i < size; i += 1) {
for (let j = 0; j < size; j += 1) {
alpha[j + i * size] = d3.sum(image_data.slice(img_offset, img_offset + 4))/3
img_offset += 4
}
}
let shift = 0;
if (normalize) {
const mean_darkness = d3.mean(alpha)
shift = mean_darkness - normalize
}
for (let i = 0; i < size; i += 1) {
for (let j = 0; j < size; j += 1) {
new_image_data[4 * (i + j * size) + 3] = alpha[i + j * size] - shift
if (color) {
try {
new_image_data.set(color, 4 * (i + j * size))
} catch {
console.warn("HMMM")
}
}
img_offset += 4
}
}
const b_and_w = DOM.context2d(size, size)
const new_imageData = new ImageData(new_image_data, size, size);
b_and_w.putImageData(new_imageData, 0, 0);
return b_and_w.canvas
}