在项目中,比如想让轮播图周围颜色和轮播图本身主色调颜色相同。那么就要用到简单的图像识别技术,强大的 js 中就有这样的库供我们使用,接下来让我们一探究竟。
1.rgbaster.js github地址 提取图片的主色、次色。
引入 rgbaster.js 文件,开始使用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 const img = document .querySelector ('img' );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 可以进行以下操作:
1 2 const c = payload.dominant .match (/\d+/g );const Color = `rgba(${c[0 ]} ,${c[1 ]} ,${c[2 ]} ,0.8)` ;
颜色有深有浅,暗色的话,黑色字体就看不清了,文字颜色得随着背景色取反,我们可以把 rgb 值转化成灰度值来判断颜色深浅。
1 2 3 4 5 6 7 8 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 github地址
1 2 3 4 5 6 7 8 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 github地址 从图像中提取突出的颜色。
1 2 3 4 5 6 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获取图片数据,如果不是同源图片将无法使用
参考文献 《主题色提取》 - 掘金