欢迎Star~git
Colorfulimg是一个可以经过canvas获取图片主题色的js工具库。github
安装:npm
npm i colorfulimg
canvas
使用方法:跨域
let colorfulimg = require('colorfulimg')
let myImg = document.getElementById('myImg')
let rgb = colorfulImg(myImg);
复制代码
这是项目地址数组
欢迎star~浏览器
下面说一下实现思路,主要是经过canvas的getImageData()方法获取图片每一个像素点的rgba数据。经过取得平均值的方法来算出图片主题色。 因此要想实现此效果有两个限制:bash
let canvas = document.createElement('canvas')
let context = canvas.getContext && canvas.getContext('2d')
复制代码
let myImg = document.getElementById('myImg')
context.drawImage(myImg , 0, 0)
复制代码
getImageData()这个API须要四个参数,前两个是获取图片数据的起点,后两个是提取的图像数据矩形区域的宽度和高度,咱们要获得图片所有的数据因此后两个参数就是图片的宽高,于此同时咱们也要把canvas的宽高设置为图片的宽高能彻底装下图片。服务器
let height = canvas.height = imgEl.height
let width = canvas.width = imgEl.width
let data = context.getImageData(0, 0, width, height).data
复制代码
在我第一次测试的时候遇到了跨域的问题:工具
图片若是不一样源的话必需要加crossorigin="anonymous"
的属性,而且服务器存储那边也要开放相应的权限才行。 <img id="img" crossorigin="anonymous">
咱们先log一下拿到的数据是什么吧:
是一个有着一堆数据的数组,这些数据是什么呢?咱们先看一下MDN:
也就是说按顺序来看前四位组成一个以RGBA顺序的数据: rgba(red, green, blue, alpha)
对于获取的图片数据透明度(alpha)都是255也就是不透明的因此咱们不对透明度作处理,以后咱们只须要把rgb的其余三个值分别求和再取均值就能够获得图片的主题色了!
let count = 0
let i = 0
let blockSize = 1
while ( (i += blockSize * 4) < length ) {
++count
rgb.r = data[i] + rgb.r
rgb.g = data[i+1] + rgb.g
rgb.b = data[i+2] + rgb.b
}
rgb.r = ~~(rgb.r/count)
rgb.g = ~~(rgb.g/count)
rgb.b = ~~(rgb.b/count)
复制代码
function colorfulImg(img){
let canvas = document.createElement('canvas'),
context = canvas.getContext && canvas.getContext('2d'),
height,width,length,data,
i = -4,
blockSize = 5,
count = 0,
rgb = {r:0,g:0,b:0}
height = canvas.height = imgEl.height
width = canvas.width = imgEl.width
context.drawImage(imgEl, 0, 0);
data = context.getImageData(0, 0, width, height).data
length = data.length
while ( (i += blockSize * 4) < length ) {
++count;
rgb.r += data[i];
rgb.g += data[i+1];
rgb.b += data[i+2];
}
rgb.r = ~~(rgb.r/count);
rgb.g = ~~(rgb.g/count);
rgb.b = ~~(rgb.b/count);
return rgb;
}
复制代码