如何在 Electron 中比较 2 个 NativeImage 实例

问题描述 投票:0回答:1

我正在 setInterval 循环中从剪贴板读取图像,我想检查用户自上次运行以来是否单击了新的屏幕截图。

目前我正在使用 toPNG() 方法并将缓冲区与前一个进行比较。这是最有效的方法吗?我可以直接比较两个 NativeImage 对象还是应该使用其他一些方法,例如 toJPEG() 或 toDataURL()。哪种方法的开销最小?

我目前的解决方案:

let newImg = clipboard.readImage();
let data = newImg.toPNG();
if (!Buffer.compare(data, prevImg)) return;
prevImg = data;

有什么方法可以避免使用 toPNG 吗?

javascript performance electron javascript-objects
1个回答
0
投票

最好与

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)

© www.soinside.com 2019 - 2024. All rights reserved.