Skip to content

Instantly share code, notes, and snippets.

@helielson
Last active October 20, 2016 20:00
Show Gist options
  • Save helielson/92f469d3c0079cac89b6f70a5bd052f8 to your computer and use it in GitHub Desktop.
Save helielson/92f469d3c0079cac89b6f70a5bd052f8 to your computer and use it in GitHub Desktop.
Replaces a color in a base 64-encoded image
function changeColorInUri(data, colfrom, colto) {
// create fake image to calculate height / width
var img = document.createElement("img");
img.src = data;
img.style.visibility = "hidden";
document.body.appendChild(img);
var canvas = document.createElement("canvas");
canvas.width = img.offsetWidth;
canvas.height = img.offsetHeight;
var ctx = canvas.getContext("2d");
ctx.drawImage(img,0,0);
// remove image
img.parentNode.removeChild(img);
// do actual color replacement
var imageData = ctx.getImageData(0,0,canvas.width,canvas.height);
var data = imageData.data;
var rgbfrom = hexToRGB(colfrom);
var rgbto = hexToRGB(colto);
var r,g,b;
for(var x = 0, len = data.length; x < len; x+=4) {
r = data[x];
g = data[x+1];
b = data[x+2];
if((r == rgbfrom.r) &&
(g == rgbfrom.g) &&
(b == rgbfrom.b)) {
data[x] = rgbto.r;
data[x+1] = rgbto.g;
data[x+2] = rgbto.b;
}
}
ctx.putImageData(imageData,0,0);
return canvas.toDataURL();
}
function hexToRGB(hexStr) {
return {
r: parseInt(hexStr.substr(1, 2), 16),
g: parseInt(hexStr.substr(3, 2), 16),
b: parseInt(hexStr.substr(5, 2), 16),
};
}
@helielson
Copy link
Author

helielson commented Oct 20, 2016

Usage:

changeColorInUri(
  'data:image/jpg;base64,R0lGODlhAQABAIAAAMLCwgAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==', 
  '#c2c2c2', 
  '#f2f2f2')

>>> "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQYV2P49OnTfwAJhgPWxUqyEAAAAABJRU5ErkJggg=="

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment