Last active
December 29, 2015 16:48
-
-
Save craigtaub/7699445 to your computer and use it in GitHub Desktop.
Image screenshot and comparison tool
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
Needs PhantomJS | |
uses Node.js File API | |
uses base64 encoding | |
event based on rendering image. | |
node modules: | |
JsDiff (https://github.com/kpdecker/jsdiff) | |
colors.js (https://github.com/brehaut/color-js) | |
imagemagick (node npm) | |
events (node npm) | |
keep in 1 place (node_modules)..then can do npm install <whatever as for> | |
npm install | |
-reads a package.json for dependencies | |
CAIRO (for imagediff): | |
sudo cp /opt/X11/lib/pkgconfig/* /usr/local/lib/pkgconfig/ | |
*/ | |
/////////////// CREATE BASE64 | |
var Base64 = { | |
// private property | |
_keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", | |
// public method for encoding | |
encode : function (input) { | |
var output = ""; | |
var chr1, chr2, chr3, enc1, enc2, enc3, enc4; | |
var i = 0; | |
input = Base64._utf8_encode(input); | |
while (i < input.length) { | |
chr1 = input.charCodeAt(i++); | |
chr2 = input.charCodeAt(i++); | |
chr3 = input.charCodeAt(i++); | |
enc1 = chr1 >> 2; | |
enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); | |
enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); | |
enc4 = chr3 & 63; | |
if (isNaN(chr2)) { | |
enc3 = enc4 = 64; | |
} else if (isNaN(chr3)) { | |
enc4 = 64; | |
} | |
output = output + | |
this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) + | |
this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4); | |
} | |
return output; | |
}, | |
// public method for decoding | |
decode : function (input) { | |
var output = ""; | |
var chr1, chr2, chr3; | |
var enc1, enc2, enc3, enc4; | |
var i = 0; | |
input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); | |
while (i < input.length) { | |
enc1 = this._keyStr.indexOf(input.charAt(i++)); | |
enc2 = this._keyStr.indexOf(input.charAt(i++)); | |
enc3 = this._keyStr.indexOf(input.charAt(i++)); | |
enc4 = this._keyStr.indexOf(input.charAt(i++)); | |
chr1 = (enc1 << 2) | (enc2 >> 4); | |
chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); | |
chr3 = ((enc3 & 3) << 6) | enc4; | |
output = output + String.fromCharCode(chr1); | |
if (enc3 != 64) { | |
output = output + String.fromCharCode(chr2); | |
} | |
if (enc4 != 64) { | |
output = output + String.fromCharCode(chr3); | |
} | |
} | |
output = Base64._utf8_decode(output); | |
return output; | |
}, | |
// private method for UTF-8 encoding | |
_utf8_encode : function (string) { | |
string = string.replace(/\r\n/g,"\n"); | |
var utftext = ""; | |
for (var n = 0; n < string.length; n++) { | |
var c = string.charCodeAt(n); | |
if (c < 128) { | |
utftext += String.fromCharCode(c); | |
} | |
else if((c > 127) && (c < 2048)) { | |
utftext += String.fromCharCode((c >> 6) | 192); | |
utftext += String.fromCharCode((c & 63) | 128); | |
} | |
else { | |
utftext += String.fromCharCode((c >> 12) | 224); | |
utftext += String.fromCharCode(((c >> 6) & 63) | 128); | |
utftext += String.fromCharCode((c & 63) | 128); | |
} | |
} | |
return utftext; | |
}, | |
// private method for UTF-8 decoding | |
_utf8_decode : function (utftext) { | |
var string = ""; | |
var i = 0; | |
var c = c1 = c2 = 0; | |
while ( i < utftext.length ) { | |
c = utftext.charCodeAt(i); | |
if (c < 128) { | |
string += String.fromCharCode(c); | |
i++; | |
} | |
else if((c > 191) && (c < 224)) { | |
c2 = utftext.charCodeAt(i+1); | |
string += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); | |
i += 2; | |
} | |
else { | |
c2 = utftext.charCodeAt(i+1); | |
c3 = utftext.charCodeAt(i+2); | |
string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); | |
i += 3; | |
} | |
} | |
return string; | |
}, | |
grabFileContents : function(file) { | |
'use strict'; | |
var fs = require('fs'), | |
system = require('system'); | |
var content = '', | |
f = null; | |
try { | |
f = fs.open(file, "r"); | |
content = f.read(); | |
} catch (e) { | |
return false; | |
//console.log(e); | |
} | |
if (f) { | |
f.close(); | |
} | |
return Base64.encode(content); | |
}, | |
theComparison : function() { | |
/////////// COMPARE | |
var one = Base64.grabFileContents("screenshots/3.png"); | |
if (one === false) { | |
console.log('first dosnt exist'); | |
console.log('delete second now'); | |
} else { | |
var two = Base64.grabFileContents("screenshots/4.png"); | |
if (two === false) { | |
console.log('second doesnt exist') | |
} else { | |
console.log('comparison:', one === two); | |
/* IMAGE MAGICK | |
var im = require('imagemagick'); | |
im.identify('screenshots/3.png', function(err, features){ | |
if (err) throw err; | |
console.log(features); | |
// { format: 'JPEG', width: 3904, height: 2622, depth: 8 } | |
}); | |
*/ | |
//emitter, util | |
/* | |
var gm = require('gm'); | |
gm('screenshots/3.png') | |
.resize(353, 257) | |
.autoOrient() | |
.write(writeStream, function (err) { | |
if (!err) console.log(' hooray! '); | |
}); | |
*/ | |
var imageDiff = require('imagediff'); | |
console.log('END'); | |
var three = imageDiff.diff("/Users/taubc01/Documents/cssregression/screenshots/4.png", "/Users/taubc01/Documents/cssregression/screenshots/3.png"); | |
imageDiff.imageDataToPNG(three, "/Users/taubc01/Documents/cssregression/screenshots/file.diff.png"); | |
console.log('DONE!!'); | |
/* | |
Error: Cannot find module 'stream' | |
TRY: | |
-git clone js-imagediff | |
-git clone canvas | |
sudo gem install jasmine-headless-webkit | |
sudo port install qt4-mac | |
cd js-imagediff | |
make | |
FAIL | |
OR | |
sudo npm install -g imagediff | |
or (npm install canvas) | |
brew install cairo | |
-issue | |
https://github.com/LearnBoost/node-canvas/wiki/Installation---OSX | |
-issue | |
sudo port install cairo | |
#ln -s /opt/X11/lib/pkgconfig/cairo.pc /usr/local/lib/pkgconfig/cairo.pc | |
? | |
OR | |
git clone git://anongit.freedesktop.org/git/cairo cairo | |
? | |
OR | |
npm install stream | |
-installs into node_modules folder | |
- require(''); will check there by default | |
NEED CAIRO FOR CANVAS | |
NEED CANVAS FOR IMAGEDIFF | |
var three = imageDiff.diff(one, two); | |
imageDataToPNG(three, "file.diff"); | |
/* DIFF | |
var JsDiff = require('/Users/craigtaub/Documents/PhantomCSS/jsdiff/diff.js'); | |
var oldString = 'beep boop'; | |
var newString = 'beep boob blah'; | |
//console.log(newString); | |
var diff = JsDiff.diffChars(oldString, newString); | |
var array = []; | |
diff.forEach(function(part){ | |
//console.log('1'); | |
//string = part.value; | |
//array.push(string); | |
}); | |
*/ | |
/* COLORS.js | |
var colors = require('/Users/craigtaub/Documents/PhantomCSS/colors.js/colors.js'); | |
var bigString = []; | |
diff.forEach(function(part){ | |
var color = part.added ? 'green' : | |
part.removed ? 'red' : 'grey'; | |
var string = ""; | |
string = part.value; | |
//console.log(string . green , string . red); | |
//many colors 1 line | |
//need to pass colour as variable NOT string ?? | |
if(color === 'green'){ | |
//console.log(string . green); | |
} | |
if(color === 'grey'){ | |
//console.log(string . green); | |
} | |
if(color === 'red'){ | |
//console.log(string . green); | |
} | |
//console.log(string); | |
bigString.push(string); | |
//var bigString = bigString.concat(string); | |
//console.log(bigString); | |
}); | |
console.log(bigString[0] . red ,bigString[1] . green ,bigString[2] . grey); | |
*/ | |
} | |
} | |
} | |
} | |
/// CREATE SNAPSHOT | |
var page = require('webpage').create(); | |
page.open('index.html', function () { | |
page.viewportSize = { width: 1000, height: 200 }; | |
page.render('screenshots/4.png'); | |
// var one = page.renderBase64(); | |
// phantom.exit(); | |
Base64.theComparison(); | |
//END EVERYTHING | |
phantom.exit(); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment