Skip to content

Instantly share code, notes, and snippets.

@ikr7
Created June 29, 2014 06:12
Show Gist options
  • Save ikr7/ff40571dc713347d6118 to your computer and use it in GitHub Desktop.
Save ikr7/ff40571dc713347d6118 to your computer and use it in GitHub Desktop.
var glitch = module.exports = function(origData, params){
if(
checkType(params, 'params', 'object')
){
var params = getNormalizedParameters(params),
jpg_header_length = getJpegHeaderSize(origData);
for(i = 0, len = params.iterations; i < len; i++){
glitchJpegBytes(origData, jpg_header_length, params.seed, params.amount, i, params.iterations);
}
return origData;
}
};
var glitchJpegBytes = function(byte_array, jpg_header_length, seed, amount, i, len){
var max_index = byte_array.length - jpg_header_length - 4;
var px_min = parseInt(max_index / len * i, 10);
var px_max = parseInt(max_index / len * (i + 1), 10);
var delta = px_max - px_min;
var px_i = parseInt(px_min + delta * seed, 10);
if (px_i > max_index) {
px_i = max_index;
}
var index = Math.floor(jpg_header_length + px_i);
byte_array[index] = Math.floor(amount * 256);
}
var getJpegHeaderSize = function(data){
var result = 417;
for (i = 0, len = data.length; i < len; i++){
if (data[i] === 255 && data[i + 1] === 218){
result = i + 2;
break;
}
}
return result;
}
var getNormalizedParameters = function(parameters){
return {
'seed': (parameters.seed || 0) / 100,
'quality': (parameters.quality || 0) / 100,
'amount': (parameters.amount || 0) / 100,
'iterations': parameters.iterations || 0
};
}
var checkType = function(it, name, expected_type){
if(typeof it === expected_type){
return true;
}else{
error(it, 'typeof ' + name, '\'' + expected_type + '\'', '\'' + typeof it + '\'');
return false;
}
};
var error = function(it, name, expected, result) {
throw new Error('glitch(): Expected ' + name + ' to be ' + expected + ', but it was ' + result + '.');
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment