javascript - 比较 2 个 imageData 对象

标签 javascript html canvas

我有 2 个 imageData 对象,它们是通过相同的上下文从相同的 Canvas 中获取的。 但是当比较它们时,当我认为它们应该包含相同的数据时它们并不相等:

var canv = document.createElement("canvas");
canv.setAttribute('width', 300);
canv.setAttribute('height', 300);
var context = canv.getContext('2d');
context.fillStyle = "#ff0000";
context.fillRect(0, 0, 300, 300);

var imageData = context.getImageData(0, 0, 300, 300);
var imageData2 = context.getImageData(0, 0, 300, 300);

if (imageData == imageData2) {
    console.log("Test1: same");
} else {
    console.log("Test1: different");
}
if (imageData.data == imageData2.data) {
    console.log("Test2: same");
} else {
    console.log("Test2: different");
}

if (imageData == imageData) {
    console.log("Test3: same");
} else {
    console.log("Test3: different");
}
if (imageData.data == imageData.data) {
    console.log("Test4: same");
} else {
    console.log("Test4: different");
}​

这段代码输出:

Test1: different
Test2: different
Test3: same
Test4: same 

因此,在比较 imageData 对象内部的数据时,将对象与自身进行比较会按预期工作,但不会与应该是相同副本的内容进行比较。

这是比较对象的问题还是我从 canvas 元素获取数据的方式遗漏了什么?

谢谢

最佳答案

imageData.data 是一个 CanvasPixelArray,它是一个对象。对于两个对象 A 和 B A == B 仅当它们引用相同的对象时才为真。

由于您正在使用两个不同的 imageData 对象,因此 imageData == imageData2imageData.data == imageData2.data 将计算为false,即使它们的属性相同。

注意 imageData.data 的类型 has been changed to Uint8ClampedArray ,即 basically Canvas 像素 ArrayBuffer .

为了检查两个图像,您必须进行基于像素的检查:

function compareImages(img1, img2) {
   if (img1.data.length != img2.data.length)
       return false;
   for (var i = 0; i < img1.data.length; ++i) {
       if (img1.data[i] != img2.data[i])
           return false;
   }
   return true;   
}

但是,可能已经有一个使用非阻塞方法的库。

关于javascript - 比较 2 个 imageData 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11754982/

相关文章:

java - HTML 表单发布与 PHP 表单发布

css - 使用动态相对定位在父容器中将一个 DIV 向左浮动,另一个向右浮动

jquery - Bootstrap 导航栏菜单项溢出

javascript - HTML5 Canvas - 使用鼠标通过 anchor 旋转

javascript - 根据屏幕分辨率动态更改图像

javascript - 我如何知道弹出窗口何时打开?

javascript - 运行多个js文件而无需每次启动和停止服务器

javascript - 如何动态地将 2 个 Canvas 添加到文档中以使它们重叠?

javascript - 是否可以拉伸(stretch) Canvas 来填充尺寸为显示:flex?的div

javascript - ReactJS:通过 props 从父级改变子级状态