Spaces:
Running
Running
File size: 1,362 Bytes
9de7b70 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | // 本地扫码自检:把生成的色号网格渲染成像素,用 jsQR 解码并比对内容
// jsQR 比微信扫码更“挑剔”,自检通过基本可以放心;未通过时提示用户调整
const jsQR = require('./vendor/jsqr')
const { hexToRgb } = require('./color')
function selfCheck(artwork, expectedText) {
const { size, cells, pal } = artwork
const px = size > 90 ? 4 : 5
const margin = 4
const dim = (size + margin * 2) * px
const data = new Uint8ClampedArray(dim * dim * 4).fill(255)
const colors = pal.hexes.map(hexToRgb)
for (let y = 0; y < size; y += 1) {
for (let x = 0; x < size; x += 1) {
const c = cells[y * size + x]
if (c < 0) continue // 空钉位视为白底
const [r, g, b] = colors[c]
for (let dy = 0; dy < px; dy += 1) {
let o = (((y + margin) * px + dy) * dim + (x + margin) * px) * 4
for (let dx = 0; dx < px; dx += 1) {
data[o] = r; data[o + 1] = g; data[o + 2] = b
o += 4
}
}
}
}
try {
const result = jsQR(data, dim, dim, { inversionAttempts: 'dontInvert' })
if (!result) return { ok: false, reason: 'unreadable' }
return { ok: result.data === expectedText, reason: result.data === expectedText ? '' : 'mismatch' }
} catch (e) {
return { ok: false, reason: 'error' }
}
}
module.exports = { selfCheck }
|