爱凉拌菜真是太好了

使用JS动态获取背景颜色

在写vue-music的时候,希望把song-list组件做成向qq音乐那样,背景颜色根据歌单封面变化

就像这样:


使用canvas 的getImageData可以获取到图片的数据,包括rgba

但是canvas 存在跨域问题。因此服务器端需要设置响应头,并且客户端设置image.crossOrigin = 'anonymous'

实现方式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
const HOST = '...';
export function getImageColor (src) {
var canvas = document.createElement('canvas')
var context = canvas.getContext('2d')
var image = new Image()
image.crossOrigin = 'anonymous'
image.src = `${HOST}/QQMusicAvatar?src=` + src
var promise = new Promise((resolve, reject) => {
image.onload = function () {
var imgWidth = this.width
var imgHeight = this.height
canvas.width = imgWidth
canvas.height = imgHeight
context.drawImage(this, 0, 0, imgWidth, imgHeight)
var imgData = context.getImageData(1, 1, 1, 1)
resolve(imgData)
}
})
return promise
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 接下来就可以在song-list 组件中调用getImageColor了
// 比如说
export default {
...
created () {
this._getImageColor();
}
methods: {
_getImageColor () {
getImageColor(this.focus.avatar)
.then((imgData) => {
this.bgColor = `rgb(${imgData.data[0]},${imgData.data[1]},${imgData.data[2]})`
this.loadingComplete = true
if (imgData.data[0] > 100 && imgData.data[1] > 100 && imgData.data[2] > 100) {
this.isDark = false
}
})
},
}
...
}