JSFiddle - React, Tailwind, and code Playground

change image colors

by abubelinha

HTML

<p>Example shifting color Hue with .getImageData</p>
<li><a href="http://jsfiddle.net/m1erickson/4apAS/" target=_blank>original jsfiddle</a> & <a href="https://stackoverflow.com/questions/23830471/convert-image-color-without-changing-its-transparent-background" target=_blank>stackoverflow</a></li>
<li><a href="http://jsfiddle.net/pHwmL/1/" target=_blank>another jsfiddle</a> & <a href="https://stackoverflow.com/questions/2688961/how-do-i-tint-an-image-with-html5-canvas" target=_blank>stackoverflow</a></li>
<p>(Original: left, Recolored: right)</p>
<canvas id="canvas" width=300 height=300></canvas>

CSS

body{ background-color: ivory; }
canvas{border:1px solid red;}

JavaScript

var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");

var img = new Image();
img.crossOrigin = "anonymous";
img.onload = start;
img.src = "https://www.gravatar.com/avatar/740943770b400ce43d8e744a24ff891c?s=64";

function start() {
    ctx.drawImage(img, 0, 0);
    ctx.drawImage(img, 150, 0);
    // shift blueish colors to greenish colors
    recolorPants(-.33);
}

function recolorPants(colorshift) {

    var imgData = ctx.getImageData(150, 0, canvas.width, canvas.height);
    var data = imgData.data; 

    for (var i = 0; i < data.length ; i += 4) {
        red = data[i + 0];
        green = data[i + 1];
        blue = data[i + 2];
        alpha = data[i + 3];

        // skip transparent/semiTransparent pixels
        if (alpha < 200) {
            continue;
        }

        var hsl = rgbToHsl(red, green, blue);
        var hue = hsl.h * 360;

        // change blueish pixels to the new color
        if (hue > 20 && hue < 50) {
            var newRgb = hslToRgb(hsl.h + colorshift, hsl.s, hsl.l);
            data[i + 0] = newRgb.r;
            data[i + 1] = newRgb.g;
            data[i + 2] = newRgb.b;
            data[i + 3] = 255;
        }
    }
    ctx.putImageData(imgData, 150, 0);
}


function rgbToHsl(r, g, b) {
    r /= 255, g /= 255, b /= 255;
    var max = Math.max(r, g, b),
        min = Math.min(r, g, b);
    var h, s, l = (max + min) / 2;

    if (max == min) {
        h = s = 0; // achromatic
    } else {
        var d = max - min;
        s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
        switch (max) {
            case r:
                h = (g - b) / d + (g < b ? 6 : 0);
                break;
            case g:
                h = (b - r) / d + 2;
                break;
            case b:
                h = (r - g) / d + 4;
                break;
        }
        h /= 6;
    }

    return ({
        h: h,
        s: s,
        l: l,
    });
}


function hslToRgb(h, s, l) {
    var r, g, b;

    if (s...