Giacomo Balli profile picture
Giacomo Balli
Your Consigliere

For owners and founders facing decisions that are expensive to get wrong.
Independent counsel from someone paid only by you.

What’s on Your Mind? LinkedIn

Add Adaptive color background

This code sample will allow you to add a smooth background gradient that takes into account the image itself when it does not fill the entire element.

function addAdaptiveBgColor(el) {
    var imgs = el.querySelectorAll('li');
    for (var i = 0; i < imgs.length; i++) {
        getImgColors(imgs[i]);
    }
}

function getImgColors(imgEl1) {
    var blockSize = 5, // only visit every 5 pixels
        defaultRGB = {
            r: 0,
            g: 0,
            b: 0
        }, // for non-supporting envs
        canvas = document.createElement('canvas'),
        context = canvas.getContext && canvas.getContext('2d'),
        data, width, height,
        i = -4,
        length,
        rgbTop = {
            r: 0,
            g: 0,
            b: 0
        },
        rgbBottom = {
            r: 0,
            g: 0,
            b: 0
        },
        count = 0;
    if (!context) {
        return;
    }
    var imgEl = new Image();
    var theSrc = imgEl1.style.backgroundImage.replace('url(', '').replace(')', '');
    imgEl.src = theSrc;
    imgEl.onload = function () {
        height = canvas.height = imgEl.naturalHeight || imgEl.offsetHeight || imgEl.height;
        width = canvas.width = imgEl.naturalWidth || imgEl.offsetWidth || imgEl.width;
        context.drawImage(imgEl, 0, 0);
        topPixels = context.getImageData(0, 0, width, 3);
        bottomPixels = context.getImageData(0, height - 3, width, 3);
        length = 3 * width;
        while ((i += blockSize * 4) < length) {
            ++count;
            rgbTop.r += topPixels.data[i];
            rgbTop.g += topPixels.data[i + 1];
            rgbTop.b += topPixels.data[i + 2];
            rgbBottom.r += bottomPixels.data[i];
            rgbBottom.g += bottomPixels.data[i + 1];
            rgbBottom.b += bottomPixels.data[i + 2];
        }

        // ~~ used to floor values
        rgbTop.r = ~~(rgbTop.r / count);
        rgbTop.g = ~~(rgbTop.g / count);
        rgbTop.b = ~~(rgbTop.b / count);
        rgbBottom.r = ~~(rgbBottom.r / count);
        rgbBottom.g = ~~(rgbBottom.g / count);
        rgbBottom.b = ~~(rgbBottom.b / count);
        imgEl1.style.webkitTransition = 'all 1s';
        imgEl1.style.backgroundSize = 'contain';
        imgEl1.style.backgroundPosition = '50% 50%';
        imgEl1.style.backgroundImage += ', linear-gradient(rgb(' + rgbTop.r + ',' + rgbTop.g + ',' + rgbTop.b + '),rgb(' + rgbBottom.r + ',' + rgbBottom.g + ',' + rgbBottom.b + '))';
    };
}

Directions:
- create your HTML with image as background then call addAdaptiveBgColor(el)

Note:
This snippet is based on a slider that uses the ul li technique.
This snippet focuses on iOS development. Make sure to verify/adapt any vendor prefixes. Back to main listing.

Published: Sun, Jan 10 2016 @ 18:51:30
Back to Blog