口罩指印
快速,决定性 视觉 diff 指纹 对于PNG图像,通过N-API作为Node.js本地模块被曝光.
此库使用 PNG diff 图像( 例如红像素视觉 diffs) 并生成一个 稳定平等指纹。 。 。 .
两个视觉上非常相近的光圈会产生 同样的指纹,允许:
fingerprintA === fingerprintB- 数据库索引
- 分组和分解
- 没有自定义比较逻辑的加入
核心算法以Rust为性能写出并被曝光出Node.js.
这能解决什么问题
经典的知觉散列需要进行相距比较,这与SQL指数或严格的等同性不起作用.
这个项目是:
- 规范 diff 口罩
- 将空间密度量化
- 粗糙的表达方式
结果是 容忍的平等,不大致相似.
如何运作
- 将 PNG 解码为 RGBA
- 提取红色像素的二进制掩码
- 吸收小像素噪声的可选扩展
- 裁剪到边框
- 可选平方贴纸
- 拆分为小网格(8×8,16×16或32×32)
- 计算每个细胞的红色密度
- 将密度量化为垃圾桶
- 用 FNV-1a- 64- bit 包装位和散列
- 返回决定性的字符串密钥
小的局部差异通常不会改变最终指纹.
安装
所需资源
- 节点.js 24或更新
- 平稳
- 货物
安装依赖关系
pnpm install
或者说
npm install
这构建了本土模块.
使用量
import fs from 'node:fs'
import { fingerprintDiff } from 'mask-fingerprint'
const png = fs.readFileSync('diff.png')
const fingerprint = await fingerprintDiff(png, {
gridSize: 16,
dilateRadius: 1,
padToSquare: true,
densityThresholds: [0.002, 0.02, 0.08],
redThreshold: {
rMin: 200,
gMax: 90,
bMax: 90,
aMin: 16,
},
})
console.log(fingerprint)
// v1:g16:d1:t0.002,0.02,0.08:3fa1c2e9a4b8d210
返回的值被设计成存储在数据库中,索引化,并使用严格的等值进行比较.
API 密码
fingerprintDiff(buffer, options?)
回返a Promise<string>。 。 。 .
参数
缓冲
- 节点.js
Buffer - Raw PNG 文件内容
选项 (可选)
{
gridSize?: 8 | 16 | 32 // default: 16
dilateRadius?: 0 | 1 // default: 1
padToSquare?: boolean // default: true
densityThresholds?: number[] // default: [0.002, 0.02, 0.08]
// sorted, values between 0 and 1
redThreshold?: {
rMin?: number // default: 200
gMax?: number // default: 90
bMax?: number // default: 90
aMin?: number // default: 16
}
}
回返
string
适合进行平等比较和索引的决定性指纹字符串.
支持的PNG格式
- RGBA (英语)
- RGB 语言
- 灰度
- 带有α的灰度
- 索引或调色板 PNG
调色板和低位深度图像自动被扩展.
性能特征
- 以像素数计的线性时间
- 没有重型浮点操作
- 热道最小分配
- 适用于分批处理
典型的工作量每秒处理上千个diff.
何时使用
不错:
- 视觉回归测试
- 屏幕截图 diff 复制
- CI 文物组装
- 数据库支持的视觉变化跟踪
不合时宜:
- 一般图像相似性搜索
- 大几何转换
- 旋转或强度变化
这个库是故意优化的 防弹口罩而非任意图像.
发展
cargo check
cargo test
重建本地模块 :
pnpm build
许可证
麻省理工学院