主题色提取

作者: 小犽 | 来源:发表于2017-11-24 00:12 被阅读0次

姚丽冰 学号:16050120089

转载:

https://juejin.im/entry/5a0e64ed51882535cd4a6679

【嵌牛导读】:在做音乐webapp的时候,被腾讯的一款本地音乐播放器(轻听)的播放界面惊艳到了,于是决定‘复制’下来。撸起袖子就开始干~

【嵌牛鼻子】:js插件:rgbaster.js,Color Thief,vibrant.js

【嵌牛提问】:首先想到的是绘入canvas中利用getImageData提取数据然后分析得到主题色,因为用的qq音乐api遇到了跨域问题,在解决跨域问题后,紧接着的问题是如何提取主题色。

【嵌牛正文】:

关于颜色提取的大概算法有这些

魔法数字法

八叉树提取法

最小插值法

中位切分法

聚类

......

具体的就看看这两篇啦

图片主题色提取算法小结

https://juejin.im/entry/5a0e64ed51882535cd4a6679

图像主题色提取算法

主题色提取

接下来介绍几款颜色提取的js插件

1.rgbaster.js

github地址。这是一段小脚本,可以提取图片的主色、次色。

使用

首先肯定是引入啦,然后上代码

const img = document.querySelector('img');

// 或者

// const img = 'http://example.com/image.jpg';

RGBaster.colors(img, {

    // 调色板大小,就是提取的样本,越大越精确,同时性能越差

    paletteSize: 30,

    // 颜色排除

    exclude: [ 'rgb(255,255,255)', 'rgb(0,0,0)' ],

    success: function(payload) {

        console.log('Dominant color:',payload.dominant);// 提取出来的主色

        console.log('Secondary color:', payload.secondary);// 次色

        console.log('Palette:', payload.palette); // 调色板

    }})

提取出来的结果是一个rgb值

需要使用rgba值的同学,只需要正则一下,提取出来再拼接就好啦

const c = payload.dominant.match(/\d+/g);

const Color = `rgba(${c[0]},${c[1]},${c[2]},0.8)`;

颜色有深有浅,暗色的话,黑色字体就看不清了,文字颜色得随着背景色取反,我们可以把rgb值转化成灰度值来判断颜色深浅

let fontColor;

const grayLevel = c[0] * 0.299 + c[1] * 0.587 + c[2] * 0.114;

      if (grayLevel >= 192) {

        // 若为浅色,把文字设置为黑色

        fontColor = '#000';

      } else {

        fontColor = '#fff';

      }

最后再给大家附上另外两款颜色提取插件

2.Color Thief

项目地址

使用

// 提取主色

const img = document.querySelector('img');

var colorThief = new ColorThief();

    console.log(colorThief.getColor(img));

}

// 调色板

var colorThief = new ColorThief();

colorThief.getPalette(sourceImage, 8);

结果

3.vibrant.js

从图像中提取突出的颜色。

Vibrant.js是Android支持库中令人敬畏的Palette类的JavaScript端口。

项目地址

使用

const img = document.querySelector('img');

var vibrant = new Vibrant(img);

    var swatches = vibrant.swatches()

    for (var swatch in swatches)

        if (swatches.hasOwnProperty(swatch) && swatches[swatch])

            console.log(swatch, swatches[swatch].getHex())

初步测试还是rgbaster出来的颜色最接近了,不过在项目中测试有些情况偏差有点远。而vibrant.js主要还是着重于把图片的颜色提取出来分类,如样例所示,结果分为暗色、亮色、突出色之类,提取主题色还是rgbaster好使。

注意: 这三款插件均是利用把图片绘入canvas获取图片数据,如果不是同源图片将无法使用

以上便是这次的文章分享了,欢迎留言相互学习~

相关文章

网友评论

    本文标题:主题色提取

    本文链接:https://www.haomeiwen.com/subject/baztbxtx.html