在web开发中有一个需求,可以根据图片内容动态提取主色改变背景颜色。满足需求的常用第三方库有node-vibrant
,rgbaster
,Color Thief
1. node-vibrant
添加依赖库
1
| "node-vibrant": "^3.1.5",
|
导入import
1
| import * as Vibrant from 'node-vibrant'
|
使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| getColor() { const imageUrl = this.state.mediaCover Vibrant.from(imageUrl) .getPalette() .then((palette) => { console.log(palette) this.findBestColor() }) }
findBestColor() { let maxPopulation = 0 let maxKey for (const key in palette) { if (palette.hasOwnProperty(key) && maxPopulation < palette[key].population) { maxPopulation = palette[key].population maxKey = key } } const imgColor = palette[maxKey] this.handleImgColor(imgColor) }
handleImgColor = (imgColor) => { const imgHsl = imgColor._hsl const s = imgHsl[1] < 0.2 ? 0.2 : (imgHsl[1] > 0.7 ? 0.7 : imgHsl[1]) const l = imgHsl[2] < 0.2 ? 0.2 : (imgHsl[2] > 0.5 ? 0.5 : imgHsl[2]) const newHsl = Vibrant.Util.hslToRgb(imgHsl[0], s, l) const r = newHsl[0] const g = newHsl[1] const b = newHsl[2] this.setState({ bgColor: Vibrant.Util.rgbToHex(r, g, b) }) }
|
2. rgbaster.js
添加依赖库
导入import
1
| import rgbaster from 'rgbaster'
|
使用
1 2 3 4 5 6 7 8 9 10
| const imageUrl = song.picture rgbaster(imageUrl, { ignore: ['rgb(255,255,255)', 'rgb(0,0,0)'], scale: 0.5 }).then(res => { const imgColor = res[0].color this.setState({ bgColor: imgColor }) })
|
参考文章:
前端图片主题色提取
魔法色预览工具