Skip to content
This repository was archived by the owner on Feb 18, 2021. It is now read-only.

Moved from crop to extent for filling images #34

Merged
merged 1 commit into from
Mar 17, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
# image-diff changelog
1.4.0 - Moved from `crop` to `extent`. Fixes #32 indirectly

1.3.0 - Fixed support for fractional differences via @jacobp100 in #29

1.2.0 - Added support for showing shadow image in diff image via @064678147 in #25
Expand Down
39 changes: 18 additions & 21 deletions lib/image-diff.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
// Load in our dependencies
var assert = require('assert');
var fs = require('fs');
var path = require('path');
var async = require('async');
Expand All @@ -8,25 +9,25 @@ var mkdirp = require('mkdirp');
var tmp = require('tmp');

// Define custom resize function
// Taken from https://github.com/twolfson/twolfson.com/blob/3.4.0/test/perceptual-tests/twolfson.com_test.js#L88-L107
// TODO: Make image resizing its own library
// DEV: This does not pollute gm.prototype
gm.prototype.fillFromTo = function (params) {
function transparentExtent(gm, params) {
// Assert we received our parameters
assert.notEqual(params.width, undefined);
assert.notEqual(params.height, undefined);
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why not more readable error messages? These parameters are read in using input from the user (eventually) so there's a chance the consuming code could have erroneous input. An assert doesn't really explain the issue all that well.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These assertions are for preventing typos from developers. There's not really a case where the error would come from user error:

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 gotcha


// Fill in new space with white background
// TODO: Parameterize background color (should be considered 'transparent' color in this case)
this.borderColor('transparent');
this.border(Math.max(params.toWidth - params.fromWidth, 0), Math.max(params.toHeight - params.fromHeight, 0));
gm.background('transparent');

// Anchor image to upper-left
// TODO: Parameterize anchor point
this.gravity('SouthEast');
gm.gravity('NorthWest');
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Isn't NorthWest the default value, so we may not have to set it explicitly?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yea, it's the default but I prefer to be explicit and we could parameterize it easily. For example, in the following images, what if someone wanted the smaller one to move to the lower right when upscaled?

https://github.com/uber/image-diff/blob/1.3.0/test/test-files/checkerboard.png

https://github.com/uber/image-diff/blob/1.3.0/test/test-files/checkerboard-excess.png

Note: Currently for gravity, it will make the 2 images look the same except there will be a transparent edge for the smaller one

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cool!


// Specify new image size
this.crop(params.toWidth, params.toHeight, 0, 0);
gm.extent(params.width, params.height);

// Return this instance
return this;
};
// Return gm instance for a fluent interface
return gm;
}

function ImageDiff() {
}
Expand Down Expand Up @@ -150,11 +151,9 @@ ImageDiff.prototype = {

// Otherwise, resize the image
actualTmpPath = filepath;
gm(actualPath).fillFromTo({
fromWidth: actualSize.width,
fromHeight: actualSize.height,
toWidth: maxWidth,
toHeight: maxHeight
transparentExtent(gm(actualPath), {
width: maxWidth,
height: maxHeight
}).write(actualTmpPath, cb);
});
},
Expand All @@ -171,11 +170,9 @@ ImageDiff.prototype = {
gm(maxWidth, maxHeight, 'transparent').write(expectedTmpPath, cb);
// Otherwise, resize the image
} else {
gm(expectedPath).fillFromTo({
fromWidth: expectedSize.width,
fromHeight: expectedSize.height,
toWidth: maxWidth,
toHeight: maxHeight
transparentExtent(gm(expectedPath), {
width: maxWidth,
height: maxHeight
}).write(expectedTmpPath, cb);
}
});
Expand Down
12 changes: 12 additions & 0 deletions test/image-diff_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,18 @@ describe('image-diff', function () {
});
});

describe('diffing the same image where 1 has a transparent background', function () {
runImageDiff({
actualImage: __dirname + '/test-files/checkerboard-transparent.png',
expectedImage: __dirname + '/test-files/checkerboard.png',
diffImage: __dirname + '/actual-files/different-transparent.png'
});

it('asserts images are the different', function () {
assert.strictEqual(this.imagesAreSame, false);
});
});

describe('diffing images with shadow on', function() {
runImageDiff({
actualImage: __dirname + '/test-files/checkerboard-excess.png',
Expand Down
Binary file added test/test-files/checkerboard-transparent.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.