使用 COLOR THIEF 获取图片主色,实现图片渐变遮罩,颜色填充等

使用 COLOR THIEF 获取图片主色,实现图片渐变遮罩,颜色填充等

Color Thief 是用于提取图片的主要颜色或者代表性颜色调色板的工具. 其使用是基于 javascript 和 canvas 的.
在这里插入图片描述

COLOR THIEF 引入

这里做简单示例,你也可以使用 npm i --save colorthief 方式引入

COLOR THIEF官方

 <script src="https://cdnjs.cloudflare.com/ajax/libs/color-thief/2.3.0/color-thief.umd.js"></script>
简单的来个html
<div class="app">
    <div>
        <img src="./test.jpg" alt="">
    </div>
    <div style="width: 400px;">
        <div>主色</div>
        <div class="box"></div>
    </div>
</div>
直接使用COLOR THIEF 根据业务需求具体操作就好了 getColor 得到一个数组, 对应rgb
<script>
    const colorThief = new ColorThief();
    const img = document.querySelector('img');
    const box = document.querySelector('.box');
    const getColorFun=()=>{
        let color = colorThief.getColor(img);
        let element = `<div class="colorbox" style="background-color: rgb(${color[0]}, ${color[1]}, ${color[2]});"></div>`;
        box.innerHTML=element;
        console.log(color)
    }
    if (img.complete) {
        getColorFun();
    } else {
        image.addEventListener('load', function () {
            getColorFun(); 
        });
    }
    
</script>
探讨下 ctx.getImageData

参考链接 图像颜色提取
颜色量化算法:中位切分法
看下效果图
在这里插入图片描述

var qulity = 100;超过这个就计算
//画布
let ctx = canvas.getContext('2d');
ctx.drawImage(img,0,0,image.width,image.height,0,0,300,150);//图片宽高自定

//读取整张图片的像素。
let data = ctx.getImageData(0, 0,image.width,image.height).data;

//获取到所有rgba,这里与你设定的高宽有关
let rgbArray=new Array();
for(var i=0;i<data.length;i+=4){
    var rdata=data[i]; //240-250
    var gdata=data[i+1]; //70-100
    var bdata=data[i+2];//80-120
    var adata=data[i+3];
    if(adata>125){
        rgbArray.push([rdata,gdata,bdata,adata]);
    }
}
GetColor(rgbArray);

//获取主题色
function GetColor(cube) {
    var maxr = cube[0][0],
        minr = cube[0][0],
        maxg = cube[0][1],
        ming = cube[0][1],
        maxb = cube[0][2],
        minb = cube[0][2];
    /*找出maxr
    minr
    maxg
    ming
    maxb
    minb*/
    for (var i = 0; i < cube.length; i++) {
        if (cube[i][0] > maxr) {
            maxr = cube[i][0];
        }
        if (cube[i][0] < minr) {
            minr = cube[i][0];
        }
        if (cube[i][1] > maxg) {
            maxg = cube[i][1];
        }
        if (cube[i][1] < ming) {
            ming = cube[i][1];
        }
        if (cube[i][2] > maxb) {
            maxb = cube[i][2];
        }
        if (cube[i][2] < minb) {
            minb = cube[i][2];
        }
    }
    if ((maxr - minr) < qulity && (maxg - ming) < qulity && (maxb - minb) < qulity) {
        var r = 0,
            g = 0,
            b = 0;
        for (var i = 0; i < cube.length; i++) {
            r += cube[i][0];
            g += cube[i][1];
            b += cube[i][2];
        }
        var divcolor = document.createElement("div");
        divcolor.style.backgroundColor = "rgba(" + r / (cube.length) + "," + g / (cube.length) + "," + b / (cube
            .length) + ")";
        divcolor.style.width = "100px";
        divcolor.style.height = "100px";
        var html = document.getElementById("imagecolor");
        html.appendChild(divcolor);
    } else {
        var maxrgb = 0;
        var rgbindex = 0;
        var rgbmiddle = 0;
        if ((maxr - minr) > maxrgb) {
            maxrgb = (maxr - minr);
            rgbmiddle = (maxr + minr) / 2
            rgbindex = 0;
        }
        if ((maxg - ming) > maxrgb) {
            maxrgb = (maxg - ming);
            rgbmiddle = (maxg + ming) / 2;
            rgbindex = 1;
        }
        if ((maxb - minb) > maxrgb) {
            maxrgb = (maxb - minb);
            rgbmiddle = (maxb + minb) / 2;
            rgbindex = 2;
        }
        //排序
        cube.sort(function (x, y) {
            return x[rgbindex] - y[rgbindex];
        });
        var cubea = new Array();
        var cubeb = new Array();
        for (var i = 0; i < cube.length; i++) {
            if (cube[i][rgbindex] < rgbmiddle) {
                cubea.push(cube[i]);
            } else {
                cubeb.push(cube[i]);
            }
        }
        GetColor(cubeb);
        GetColor(cubea);
    }
}
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Vue3 + TypeScript 中提取图片颜色代码和解析 CSS 提取图片主题色的方法与 Vue2 + JavaScript 基本一致,只是需要在 Vue3 的 Composition API 中使用。 1. 如何提取图片颜色代码 可以使用 Vue3 的生命周期函数 onMounted 来实现提取图片颜色代码的功能。具体步骤如下: 1) 在 template 中添加一个 image 元素。 ``` <template> <div> <img ref="image" src="图片链接" /> </div> </template> ``` 2) 在 setup 函数中获取 image 元素,并将图片绘制到 Canvas 上。 ``` import { onMounted } from 'vue'; export default { setup() { const imageRef = ref(null); onMounted(() => { const canvas = document.createElement('canvas'); const ctx = canvas.getContext('2d'); const img = imageRef.value; img.onload = () => { canvas.width = img.width; canvas.height = img.height; ctx.drawImage(img, 0, 0, img.width, img.height); }; }); return { imageRef, }; }, }; ``` 3) 获取 Canvas 上某个像素的颜色代码。 ``` import { ref } from 'vue'; const pixelData = ctx.getImageData(x, y, 1, 1).data; const colorCode = '#' + ((1 << 24) + (pixelData[0] << 16) + (pixelData[1] << 8) + pixelData[2]).toString(16).slice(1); ``` 其中 x 和 y 表示像素的坐标,pixelData 是一个长度为 4 的数组,分别表示 RGBA 四个通道的值。将 RGB 三个通道的值拼接成一个 16 进制数,并加上前缀“#”就是颜色代码了。 2. 解析 CSS 提取图片主题色功能 可以使用第三方库 color-thief实现解析 CSS 提取图片主题色的功能。具体步骤如下: 1) 安装 color-thief 库。 ``` npm install color-thief --save ``` 2) 在 Vue 组件中引入 color-thief 库。 ``` import ColorThief from 'color-thief'; ``` 3) 在 setup 函数中创建一个 Image 元素,并将图片加载到 Image 上。 ``` const colorThief = new ColorThief(); const img = new Image(); img.src = '图片链接'; img.onload = () => { const color = colorThief.getColor(img); console.log(color); }; ``` colorThief.getColor(img) 函数的返回值是一个长度为 3 的数组,分别表示 RGB 三个通道的值。将 RGB 三个通道的值拼接成一个 16 进制数,并加上前缀“#”就是图片的主题色了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值