在我的代码笔中,我想使用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});
我得到了这个工作
- 从
<img>
标记创建图像数据对象,并从图像中检索Uint8Array
的数据 - 使用
imageData.data
将每个图像的Uint8Array
传递给函数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>
辅助函数
首先是一个帮助程序函数,用于从图像中获取"画布">
// 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
中的值在第三个图像或画布上显示两个图像的差异 - 不起作用的内容:创建黑色图像或输出画布为空
这是不会产生所需结果的代码
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)
的输出画布为空? 我必须更改什么才能将imgDataOutput
作为<img>
或<canvas>
放在页面上?
这是我匹配的代码笔
问题是你需要在这里将".data"添加到imgDataOutput:
var numDiffPixels = pixelmatch(imgDataBefore.data, imgDataAfter.data,
imgDataOutput.data, wdth, hght, {threshold: 0.1});
我还补充说:
canvas.width = imgDataOutput.width;
canvas.height = imgDataOutput.height;
以写入结果到页面,以便画布的大小适合图像。
更新的代码笔:https://codepen.io/anon/pen/dEVNmv