Sharp based implementation of perceptual hash (phash) algorithm described there.
'use strict';
const fs = require('fs');
const Promise = require('bluebird');
const assert = require('assert');
const phash = require('sharp-phash');
const dist = require('sharp-phash/distance');
const img1 = fs.readFileSync('./Lenna.png');
const img2 = fs.readFileSync('./Lenna.jpg');
const img3 = fs.readFileSync('./Lenna-sepia.jpg');
Promise.all([
phash(img1),
phash(img2),
phash(img3)
])
.then(([hash1, hash2, hash3]) => {
// hash returned is 64 characters length string with 0 and 1 only
assert(dist(hash1, hash2) < 5);
assert(dist(hash2, hash3) < 5);
assert(dist(hash3, hash1) < 5);
});