perceptualdiff
Version:
A port of the perceptualdiff image comparison (pdiff.sourceforge.net), and adding some additional features
154 lines (115 loc) • 7.44 kB
Markdown
node-perceptualdiff
===================
A node port of the perceptualdiff image comparison (http://pdiff.sourceforge.net) with some additional features
#Usage:
The package can be used in two different ways:
* per command line; just as the original project
* through a class in your code
##Command-Line usage:
The command-line tool can be found in the ```bin``` directory. You can run the application with
```
node ./bin/perceptualdiff.js <image1>.png <image2>.png
```
Use ```image1``` and ```image2``` as the images you want to compare.
**Note:** This port only supports PNGs!
The command-line tool exposes a couple of flags and parameters for the comparison:
```
--verbose Turn on verbose mode"
--fov deg Field of view in degrees [0.1, 89.9] (default: 45.0)
--threshold p Number of pixels/percent p below which differences are ignored
--threshold-image p Number of pixels/percent p below which differences are not generated (see --output)
--threshold-type p 'pixel' and 'percent' as type of threshold. (default: pixel)
--pyramid-levels p Number of levels of Laplacian pyramids. (default: 3)
--gamma g Value to convert rgb into linear space (default: 2.2)
--luminance l White luminance (default: 100.0 cdm^-2)
--luminance-only Only consider luminance; ignore chroma (color) in the comparison
--color-factor How much of color to use [0.0, 1.0] (default: 1.0)
--scale Scale images to match each others dimensions
--sum-errors Print a sum of the luminance and color differences
--output o Write difference to the file o
--version Print version
--help This help
```
Most of the parameters were exposed as the original project does. However, I changed a couple of parameter signatures
to make the interface a little bit more consistent.
* ```--luminanceonly``` was renamed to ```luminance-only```
* ```--colorfactor``` was renamed to ```color-factor```
Since the PNG library, I use, does not support resampling, I needed to remove this feature for now.
So, there is no ```--resample```. Please resample the images through other means before using this diff-tool.
I also added a couple additional features and some were exposed to the command-line tool:
* ```--threshold-image p``` makes it possible to skip some of the comparison, reducing the time spent analysing the
images as node is a LOT slower than C is. This feature will also skip the creation of output images if this threshold is not reached; it simply stops caring if the difference is below the threshold.
* ```--threshold-type p``` changes the threshold by considering absolute pixels or percentage of total pixels. The values are ```pixel``` and ```percent``` respectively.
* ```--pyramid-levels p``` specifies the detail of the comparison - the higher the number is, the higher the comparison resolution but also the longer it will take. ```2``` is the lowest number possible. The original perceptualdiff tool used internally 8 as default. Again, node is just too slow.
##Class usage:
The package can also be used directly in code, without going through the command-line.
**Example:**
```JavaScript
var PerceptualDiff = require('perceptualdiff');
var diff = new PerceptualDiff({
imageAPath: '...',
imageBPath: '...',
scale: true,
verbose: true,
pyramidLevels: 5,
thresholdType: PerceptualDiff.THRESHOLD_PERCENT,
threshold: 0.01,
imageThreshold: 0.005,
outputPath: '...'
});
diff.run(function (passed) {
console.log(passed ? 'Passed' : 'Failed');
});
```
All the parameters that were available in the command-line tool are also available through the class constructor - they use
camelCasing instead of snake-casing. The class exposes additional parameters that are not available from the command-line.
* ```imageAPath``` Defines the path to the first image that should be compared (required)
* ```imageBPath``` Defines the path to the second image that should be compared (required)
* ```imageOutputPath``` Defines the path to the output-file. If you leaves this one off, then this feature is turned-off.
* ```verbose``` Verbose output (default: false)
* ```luminanceOnly``` Only consider luminance; ignore chroma (color) in the comparison (default: false)
* ```sumErrors``` Print a sum of the luminance and color differences (default: false)
* ```fieldOfView``` Field of view in degrees [0.1, 89.9] (default: 45.0)
* ```gamma``` Value to convert rgb into linear space (default: 2.2)
* ```luminance``` White luminance (default: 100.0 cdm^-2)
* ```thresholdType``` Type of threshold check. This can be PerceptualDiff.THRESHOLD_PIXEL and PerceptualDiff.THRESHOLD_PERCENT (default: THRESHOLD_PIXEL)
* ```threshold``` Number of pixels/percent p below which differences are ignored (default: 100)
* ```imageThreshold``` Number of pixels/percent p below which differences are not generated (default: 50)
* ```colorFactor``` How much of color to use [0.0, 1.0] (default: 1.0)
* ```pyramidLevels``` Number of levels of Laplacian pyramids. (default: 3)
* ```scale``` Scale images to match each others dimensions (default: false)
* ```outputMaskRed``` Red intensity for the difference highlighting in the output file (default: 255 - full red)
* ```outputMaskGreen``` Green intensity for the difference highlighting in the output file (default: 0)
* ```outputMaskBlue``` Blue intensity for the difference highlighting in the output file (default: 0)
* ```outputMaskAlpha``` Alpha intensity for the difference highlighting in the output file (default: 255)
* ```outputMaskOpacity``` Opacity of the pixel for the difference highlighting in the output file (default: 0.7 - slightly transparent)
* ```outputBackgroundRed``` Red intensity for the background in the output file (default: 0)
* ```outputBackgroundGreen``` Green intensity for the background in the output file (default: 0)
* ```outputBackgroundBlue``` Blue intensity for the background in the output file (default: 0)
* ```outputBackgroundAlpha``` Alpha intensity for the background in the output file (default: 0 - transparent)
* ```copyImageAToOutput``` Copies the first image to the output image before the comparison begins. This will make sure that the output image will highlight the differences on the first image.
* ```copyImageBToOutput``` Copies the second image to the output image before the comparison begins. This will make sure that the output image will highlight the differences on the second image.
###Logging:
By default, the logger doesn't log events anywhere, but you can overwrite this behavior by overwriting ```PerceptualDiff.log```:
```JavaScript
var diff = new PerceptualDiff({
...
});
diff.log = function (text) {
// Do whatever you want to do
};
...
```
#Example:
There are some examples in the ```examples``` folder, where I used screenshots of Wikipedia to check for visual regressions.
You can find examples for:
* Missing DOM elements in ```hidden_regression```
* Disrupted sorting in ```sorting_regression```
* Color changes in ```style_regression```
* Text capitalization in ```text_regression```
All screenshots were compared to ```wikipedia_approved.png```, a previously approved screenshot without a regression.
Each of the regression has the screenshot and the output result, highlighting the differences.
#TODO:
* Code documentation
#LICENSE
The original project was release with the GPL v2 license.