async function blueNoiseFrom(image, { sorted } = {}) {
image = await image;
const w = image.naturalWidth,
h = image.naturalHeight;
const context = DOM.context2d(w, h, 1);
context.drawImage(image, 0, 0, w, h);
let data = new Uint32Array(context.getImageData(0, 0, w, h).data.buffer);
if (sorted) data = data.map((d) => d & 0x00ffffff);
else data = d3.rank(data, (i, j) => j - i || 1);
const r = 1 / data.length;
return (x, y) => r * data[(x % w | 0) + w * (y % w | 0)];
}