UNPKG

@syngrisi/node-resemble.js

Version:
145 lines (115 loc) 4.58 kB
# @syngrisi/node-resemble.js <p align="center"> <a href="https://nodejs.org/docs/latest-v22.x/api/index.html"><img src="https://img.shields.io/badge/node-22+-brightgreen.svg"></a> <a href="https://www.npmjs.com/package/@syngrisi/node-resemble.js"><img src="https://img.shields.io/npm/v/@syngrisi/node-resemble.js.svg"></a> </p> Image analysis and comparison library for Node.js. This is a supported fork of [node-resemble.js](https://github.com/burnpiro/node-resemble.js), which is a modification of [Resemble.js](https://github.com/Huddle/Resemble.js). This project does not need canvas or any other binary dependencies (uses [sharp](https://github.com/lovell/sharp) for image processing). ## Installation ```bash npm install @syngrisi/node-resemble.js ``` or ```bash yarn add @syngrisi/node-resemble.js ``` ### Example ##### Retrieve basic analysis on image. ```javascript var api = resemble(fileData).onComplete(function(data){ console.log(data); /* { red: 255, green: 255, blue: 255, brightness: 255 } */ }); ``` ##### Use resemble to compare two images. ```javascript var diff = resemble(file).compareTo(file2).ignoreColors().onComplete(function(data){ console.log(data); /* { misMatchPercentage : 100, // % isSameDimensions: true, // or false dimensionDifference: { width: 0, height: -1 }, // defined if dimensions are not the same getDiffImage: function(){}, // returns the diff image (PNG object) getDiffImageAsJPEG: function(quality){} // returns the diff image as a JPEG buffer } */ }); ``` ##### You can also change the comparison method after the first analysis. ```javascript // diff.exact(); // true pixel-to-pixel, zero tolerance // diff.ignoreNothing(); // tolerant (±16 per channel) // diff.ignoreColors(); diff.ignoreAntialiasing(); ``` ##### Specify matching Box for image comparsion ```javascript diff.ignoreRectangles([[325,170,100,40], [10,10,200,200]]); ``` - Ignores matched rectangles - <[Array<Array[x, y, width, height]>]> ```javascript diff.includeRectangles([[325,170,100,40], [10,10,200,200]]); ``` - Compares only within given rectangles - <[Array<Array[x, y, width, height]>]> ##### Change the output display style. ```javascript resemble.outputSettings({ errorColor: { red: 255, green: 0, blue: 255 }, errorType: 'movement', transparency: 0.3 }); // resembleControl.repaint(); ``` -------------------------------------- ## Example usuage (in cucumber step definition) this.Then(/^Screenshot should match image "(.*)"$/, function (image, callback) { browser.takeScreenshot().then(function(pngString) { var screenshot = new Buffer(pngString, 'base64'); resemble(image) .compareTo(screenshot) .onComplete(function(data){ if (Number(data.misMatchPercentage) <= 0.01) { callback(); } else { data.getDiffImage().pack().pipe(fs.createWriteStream(image + 'diff.png')); callback.fail(new Error("Screenshot '" + image+ "' differ " + data.misMatchPercentage + "%")); } }); }); }) -------------------------------------- -------------------------------------- ## Why this package ships raw `resemble.js` `resemble.js` is a maintained fork kept intentionally close to upstream [Resemble.js](https://github.com/Huddle/Resemble.js) — the file itself notes this ("keeping wrong indentation and '_this' for better diff with origin resemble.js") to keep future upstream diffs small and easy to review. Unlike the other packages in this monorepo, it is **not** compiled with `tsc`: the comparison/diff algorithm it implements is baseline-affecting (changing it would invalidate visual baselines across every consumer of this repo), so it is deliberately frozen and shipped as-is. Type declarations are instead provided via a small, hand-written `resemble.d.ts` covering the API surface consumers actually use (the `resemble(...).compareTo(...).ignore*().onComplete(...)` chain and `resemble.outputSettings(...)`), rather than being generated by compiling the source. The `build` script is an intentional no-op that documents this choice so monorepo-wide build loops don't break. Credits: * Created by [James Cryer](http://github.com/jamescryer) and the Huddle development team. * [Lukas Svoboda](http://github.com/lksv) - modification for node.js * [Kemal Erdem](https://github.com/burnpiro) - modification * [Viktar Silakou](https://github.com/viktor-silakov) - modification