javascript - 比较两个图像并使用像素匹配查看差异 - 刷新 Canvas 失败

标签 javascript html dom html5-canvas

my codepen 我想使用 pixelmatch在浏览器中显示两个图像的差异。函数是这样使用的

// img1, img2 — ImageData.data of the images to compare  
// output — ImageData to write the diff to, or null if don't need a diff image.
// width, height of the images - all 3 images need to have the same dimensions.


// calling pixelmatch  looks like this
var numDiffPixels = pixelmatch(img1.data, img2.data
      , imageDataOutput, wdth, hght, {threshold: 0.1});

我得到了这个工作
  • 创建 ImageData -来自 <img> 的对象-标记并检索数据为Uint8Array来自图片
  • 通过Uint8Array每张图片使用 imageData.data到函数 pixelmatch
  • 填写imageDataOutput并在 numDiffixels 中获得许多不同的像素

  • HTML
    <p>
        <img id="imgBefore" src="./img/T1_Before.jpg">
        <img id="imgAfter" src="./img/T1_After.jpg"  >
    </p>
    <p>
        <button id="diff" class="js-compareImages">compare images</button>
        <canvas id="cnvDiff"></canvas>
    </p>
    <p id="result"> </p>
    

    辅助函数

    首先是从图像中获取“ Canvas ”的辅助函数
    // Converts image to canvas; returns new canvas element
    function convertImageToCanvas(imageID) {
        var image = document.getElementById(imageID);
        var canvas = document.createElement("canvas");
        canvas.width = image.width;
        canvas.height = image.height;
        canvas.getContext("2d").drawImage(image, 0, 0);
        // image.style = "width: 400px";
        return canvas;
    }
    

    主函数

    比较图像的主要功能
    function compareImages()
    {        
        var cnvBefore = convertImageToCanvas("imgBefore");
        var cnvAfter = convertImageToCanvas("imgAfter");
    
        var ctxBefore = cnvBefore.getContext("2d");
        var ctxAfter = cnvAfter.getContext("2d");
    
        let imgDataBefore = ctxBefore.getImageData(0,0,cnvBefore.width, cnvBefore.height);
        let imgDataAfter = ctxAfter.getImageData(0,0, cnvAfter.width, cnvAfter.height);   
    
        const hght = imgDataBefore.height;
        const wdth = imgDataBefore.width;
    
        var imgDataOutput = new ImageData(wdth, hght);
    
        var numDiffPixels = pixelmatch(imgDataBefore.data, imgDataAfter.data, 
                            imgDataOutput, wdth, hght, {threshold: 0.1});
    
         // this line does not work
         writeResultToPage(imgDataOutput)
    
    }
    

    什么不起作用
  • 使用 imgDataOutput 中的值在第三张图像或 Canvas 上显示两个图像的差异
  • 什么不起作用:创建黑色图像或输出 Canvas 为空

  • 这是不会产生预期结果的代码
    function writeResultToPage(imgDataOutput)
    {
      var canvas = document.createElement("canvas"); //  new HTMLCanvasElement();
        var ctx = canvas.getContext("2d");
        ctx.putImageData(imgDataOutput, 0, 0);
        var result = document.getElementById("result");
        result.appendChild(ctx.canvas);
    }
    

    问题

    为什么 writeResultToPage(imgDataOutput) 的输出 Canvas 是空的?
    我必须改变什么才能放imgDataOutput在页面上作为 <img>或作为 <canvas> ?

    这里是 my matching codepen

    最佳答案

    问题是您需要在此处将“.data”添加到 imgDataOutput:

    var numDiffPixels = pixelmatch(imgDataBefore.data, imgDataAfter.data, 
                        imgDataOutput.data, wdth, hght, {threshold: 0.1});
    

    我还补充说:
    canvas.width = imgDataOutput.width;
    canvas.height = imgDataOutput.height;
    

    writeResultToPage 使 Canvas 的大小适合图像。

    更新的代码笔:https://codepen.io/anon/pen/dEVNmv

    关于javascript - 比较两个图像并使用像素匹配查看差异 - 刷新 Canvas 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56216348/

    相关文章:

    javascript - 从 javascript 获取对 anchor 的 dom 元素的引用

    javascript - 有没有办法阻止 HTML accesskey =""被激活?

    javascript - 如何使用 JQuery 将事件应用到动态加载的 DOM 节点?

    javascript - 无法在控制台中删除变量

    javascript - 我的浏览器中的 Minifier js 导致变量已经被声明

    javascript - 检查一个具有动态值的单选按钮

    javascript - html5 canvas "graphics persistence"重新定位/调整大小

    javascript - 删除 Javascript 生成的 HTML

    javascript - 在模态窗口中显示运行进程的进度

    javascript - 选择 2 取消/阻止默认选择 2 :select at specific condition (v. 4.0.x)