我正在 setInterval 循环中从剪贴板读取图像,我想检查用户自上次运行以来是否单击了新的屏幕截图。
目前我正在使用 toPNG() 方法并将缓冲区与前一个进行比较。这是最有效的方法吗?我可以直接比较两个 NativeImage 对象还是应该使用其他一些方法,例如 toJPEG() 或 toDataURL()。哪种方法的开销最小?
我目前的解决方案:
let newImg = clipboard.readImage();
let data = newImg.toPNG();
if (!Buffer.compare(data, prevImg)) return;
prevImg = data;
有什么方法可以避免使用 toPNG 吗?
最好与
toPNG
以外的函数进行比较,因为这是迄今为止各种 NativeImage -> Buffer|string
转换函数中最慢的:
toPNG --- 144ms
toDataURL --- 0ms
toBitmap --- 4ms
toJPEG(0) --- 13ms
toJPEG(100) --- 25ms
测试代码(1920x1080 图像):
const measureNext = (name: string, func: ()=>any)=>{
const startTime = Date.now();
func();
console.log(`${name} --- ${Date.now() - startTime}ms`);
};
measureNext("toPNG", ()=>image.toPNG());
measureNext("toDataURL", ()=>image.toDataURL());
measureNext("toBitmap", ()=>image.toBitmap());
measureNext("toJPEG(0)", ()=>image.toJPEG(0));
measureNext("toJPEG(100)", ()=>image.toJPEG(100));
所以我仅使用
toDataURL
进行内容比较,例如:img1.toDataURL() == img2.toDataURL()
请注意,对于
Buffer
,Buffer.compare(buf1, buf2) == 0
的替代方案是:buf1.equals(buf2)