common/compareImage.js (45 lines of code) (raw):

const fs = require('fs'); const PNG = require('pngjs').PNG; const pixelmatch = require('pixelmatch'); function readPNG(path) { return new Promise((resolve) => { fs.createReadStream(path) .pipe(new PNG()) .on('parsed', function () { resolve({ data: this.data, width: this.width, height: this.height }); }); }); } module.exports.compareImage = function ( targetPath, sourcePath, threshold = 0.1 ) { if (!fs.existsSync(targetPath)) { return true; } return Promise.all([readPNG(targetPath), readPNG(sourcePath)]).then( ([expectedImg, actualImg]) => { let width = expectedImg.width; let height = expectedImg.height; if (width !== actualImg.width || height !== actualImg.height) { return { diffRatio: 1 }; } const diffPNG = new PNG({ width, height }); let diffPixelsCount = pixelmatch( expectedImg.data, actualImg.data, diffPNG.data, width, height, { threshold } ); let totalPixelsCount = width * height; return { diffRatio: diffPixelsCount / totalPixelsCount, diffPNG }; } ); };