Vue 3: 通过图片链接获取图片颜色,间接设置背景颜色

       在现代Web开发中,动态获取和处理图像数据是一个常见的需求。例如,你可能希望自动提取一张图片的主色调,以便根据这些颜色进行UI主题调整或其他视觉效果的处理。本文将介绍如何在Vue 3项目中,通过一个图片链接获取图片的颜色信息。

适用场景:设置背景色(例如:根据音乐图片设置主题色)
案例地址:(音乐模块的歌词)

天梦星科技官网icon-default.png?t=O83Ahttps://tmxkj.top/#/music案例截图:

1.废话不多说直接上代码(代码已经封装好,直接调用即可)

async function analyzeImageColors(imageUrl) {
    try {
        const image = new Image();
        image.crossOrigin = 'Anonymous'; // This is important for CORS issues
        image.src = imageUrl;

        await new Promise((resolve, reject) => {
            image.onload = () => resolve();
            image.onerror = (err) => reject(err);
        });

        const canvas = document.createElement('canvas');
        const context = canvas.getContext('2d');
        canvas.width = image.width;
        canvas.height = image.height;
        context.drawImage(image, 0, 0, image.width, image.height);

        const imageData = context.getImageData(0, 0, image.width, image.height).data;
        return getColorsFromImageData(imageData, image.width, image.height);
    } catch (error) {
        console.error('Error analyzing image:', error);
        return null;
    }
}

/**
 * 获取图片颜色
 * @param imageData
 * @param width
 * @param height
 * @description 颜色分别是四个角是颜色,中间是颜色,主体颜色,平均颜色,一共七个颜色
 * @returns {{
 * middleColors: string[]
 * average: string,
 * corners: (string|null)[],
 * dominant: null,
 * secondDominant: null
 * }}
 */
function getColorsFromImageData(imageData, width, height) {
    const colorCount = {};
    let r = 0, g = 0, b = 0;
    let totalPixels = width * height;

    // Initialize corner colors and middle color arrays
    const corners = [null, null, null, null];
    const middleColors = [];

    for (let i = 0; i < imageData.length; i += 4) {
        const red = imageData[i];
        const green = imageData[i + 1];
        const blue = imageData[i + 2];
        const alpha = imageData[i + 3];

        if (alpha === 0) continue; // Skip transparent pixels

        const colorKey = `${red},${green},${blue}`;
        if (!colorCount[colorKey]) {
            colorCount[colorKey] = 0;
        }
        colorCount[colorKey]++;

        r += red;
        g += green;
        b += blue;

        // Determine if the pixel is a corner or middle pixel
        const x = (i / 4) % width;
        const y = Math.floor((i / 4) / width);
        if (x === 0 && y === 0) {
            corners[0] = colorKey;
        } else if (x === width - 1 && y === 0) {
            corners[1] = colorKey;
        } else if (x === 0 && y === height - 1) {
            corners[2] = colorKey;
        } else if (x === width - 1 && y === height - 1) {
            corners[3] = colorKey;
        } else if (x === Math.floor(width / 2) && y === Math.floor(height / 2)) {
            middleColors.push(colorKey);
        }
    }

    // Find the dominant and second dominant colors
    let dominantColor = null;
    let secondDominantColor = null;
    let maxCount = 0;
    let secondMaxCount = 0;

    for (const [color, count] of Object.entries(colorCount)) {
        if (count > maxCount) {
            secondMaxCount = maxCount;
            secondDominantColor = dominantColor;
            maxCount = count;
            dominantColor = `rgba(${color})`;
        } else if (count > secondMaxCount) {
            secondMaxCount = count;
            secondDominantColor = `rgba(${color})`;
        }
    }

    // Calculate average color
    const averageColor = `rgba(${Math.round(r / totalPixels)}, ${Math.round(g / totalPixels)}, ${Math.round(b / totalPixels)})`;

    return {
        corners: corners.map(color => color ? `rgba(${color})` : null),
        middleColors: middleColors.map(color => `rgba(${color})`),
        dominant: dominantColor,
        secondDominant: secondDominantColor,
        average: averageColor,
    };
}

/**
 * 创建渐变色180deg
 * @param mainColor   1主色
 * @param topRight    2右上角颜色
 * @param center      3中心颜色
 * @param bottomRight 4右下角颜色
 * @param deg         5径向,默认180deg
 * @returns {string} 返回渐变色字符串
 */
function createRadialGradient(mainColor,topRight,center,bottomRight,deg=180) {
    return `background: ${mainColor};background: linear-gradient(${deg}deg, ${topRight} 0%,${center}  50%, ${bottomRight} 100%);`
}


export {
    analyzeImageColors,
    createRadialGradient
};

2.调用方法

/**
 * 设置背景颜色
 * @param url
 * @returns {Promise<string|string>}
 */
function setBackgroundColor(url) {
  analyzeImageColors(url ||  'https://ts3.cn.mm.bing.net/th?id=OIP-C.8tlwbGsJvlNZwGAGL36W8AHaFS&w=295&h=211&c=8&rs=1&qlt=90&o=6&dpr=2&pid=3.1&rm=2').then(res => {
    backgroundStyle.value = createRadialGradient(res.dominant, res.corners[1], res.middleColors, res.corners[3]) || '';
  })
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/938149.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

请确保 $(OutDir)、$(TargetName) 和 $(TargetExt) 属性值与 %(Link.OutputFile) 中指定的值匹配

vs版本升级时&#xff0c;编译时会出现上述问题&#xff0c;如原来在2017下编译的程序&#xff0c;后来改用2019&#xff0c;出现上述问题。需要在解决方案-通用属性-调试源文件下变更相应设置。

FFmpeg第一话:FFmpeg 简介与环境搭建

FFmpeg 探索之旅 一、FFmpeg 简介与环境搭建 二、FFmpeg 解码详解 第一话&#xff1a;FFmpeg 简介与环境搭建 FFmpeg 探索之旅一、前言二、FFmpeg 是什么&#xff1f;三、简单介绍其历史背景四、为什么用 C学习 FFmpeg&#xff1f;&#xff08;一&#xff09;高性能优势&#…

【功能安全】软件安全架构

目录 01 软件安全架构介绍 02 软件架构设计模板 03 软件架构设计示例 01 软件安全架构介绍

OpenLinkSaas 2025年1月开发计划

先来看看OpenLinkSaas的大目标 在OpenLinkSaas的产品目标中&#xff0c;让开发人员更加方便的使用云资源是目标之一。通过各大云厂商的API&#xff0c;来可视化云上基础设施的数据是远远不够的。我们准备在2025年1月份增加方便管理和运营研发场景下服务器的能力。 这部分的功能…

【Verilog】实验九 存储器设计与IP调用

一、实验目的 1. 掌握单端口RAM和ROM原理和设计方法。 2. 掌握单端口RAM和ROM的IP生成和调用方法。 2. 掌握ModelSim和VIVADO工具软件。 3. 掌握基本的测试代码编写和FPGA开发板使用方法。 二、实验环境 1. 装有ModelSim和VIVADO的计算机。 2. Sword实验系统。 三、实验…

元力音乐 1.2.2 | 完全免费无广告的无损音乐听歌下载工具

元力音乐是一款音乐听歌和下载工具&#xff0c;提供完全免费且没有任何广告弹窗的用户体验。内置两条线路&#xff0c;用户可以无限次下载无损音质音乐。作者承诺永久免费并长期维护此应用。此外&#xff0c;它还支持导入歌单功能&#xff0c;让用户能够轻松管理和下载喜爱的音…

生产环境迁移——harbor篇

这些年环境迁移干了很多&#xff0c;但是没有总结&#xff0c;想想还是记录一下&#xff0c;以前是下属做&#xff0c;自己统筹就行&#xff0c;现在就剩下孤家寡人了&#xff0c;只好都自己做。还是完整记录下来&#xff0c;供有缘人参考。其实我也是搭了个草台班子。 1 安装…

电脑问题4[非华为电脑安装华为电脑管家华为荣耀手机多屏协助]

非华为电脑安装华为电脑管家华为荣耀手机多屏协助 我是荣耀手机之前一直用的是window的"连接手机"功能,电脑控制手机还蛮好用,但是又不能够没有好的电脑控制手机的功能,后来想了想看了看,竟然安装了华为电脑关键,竟然可以顺利连接上荣耀手机,发现还蛮好用! 本文引用…

KeyFormer:使用注意力分数压缩KV缓存

Keyformer: KV Cache Reduction through Key Tokens Selection for Efficient Generative Inference 202403&#xff0c;发表在Mlsys Introduction 优化KV cache的策略&#xff0c;主要是集中在系统级别的优化上&#xff0c;比如FlashAttention、PagedAttention&#xff0c;它…

linux ibus rime 中文输入法,快速设置为:默认简体 (****)

本文环境&#xff1a; ubuntu 22.04 直接 apt install ibus-rime 输入法的安全性&#xff0c;人们应该关注吧&#xff01;&#xff01;&#xff1f;&#xff1f; 云输入法&#xff1f;将用户的输入信息传输到云端吗&#xff1f; Rime 等的一些输入法&#xff0c;是本地的&…

【python从入门到精通】-- 第七战:字典

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;重生之我在学Linux&#xff0c;C打怪之路&#xff0c;python从入门到精通&#xff0c;数据结构&#xff0c;C语言&#xff0c;C语言题集&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持…

海外本地化呼叫中心有哪些独特优势?

随着全球化的深入推进&#xff0c;企业越来越注重拓展海外市场&#xff0c;而海外本地化呼叫中心作为企业海外拓展的重要工具&#xff0c;其独特优势逐渐凸显。沃丰科技呼叫中心系统凭借其先进的功能和卓越的服务质量&#xff0c;为众多企业提供了完美的解决方案。 语言与文化…

优选算法——分治(归并)

1. 归并排序 题目链接&#xff1a;912. 排序数组 - 力扣&#xff08;LeetCode&#xff09; 题目展示&#xff1a; 题目分析&#xff1a;这里我们直接来实现归并排序即可&#xff1b; 代码实现&#xff1a; class Solution {vector<int> tmp;//在全局创建辅助数组&…

Java从入门到工作1 - 语法

1.1、注解 注解困扰了我很长时间&#xff0c;看了一堆概念。要理解注解&#xff0c;首先得理解两个概念元数据和反射机制 元数据是关于数据的数据。它提供了关于其他数据的信息或描述。例如&#xff0c;在数据库中&#xff0c;记录的结构&#xff08;字段类型、字段名称等&am…

MySQL其五,索引详解,逻辑架构,SQL优化等概念

目录 一、索引 1、索引的概念 2、索引的优缺点 3、添加索引的原则 4、索引的分类 5、索引如何使用 6、存储过程讲解 7、测试索引的效率 7、索引的数据结构 8、覆盖索引&#xff08;SQL优化的点&#xff09; 9、最佳左前缀法则&#xff08;SQL优化的点&#xff09; 二…

简单的go写的websocket协议 im 聊天 服务,流程简单清晰,采用golang编写,flutter im客户端。免费开源哈,随意用

mini-im 1、说明&#xff1a; 项目地址&#xff1a;https://github.com/haomiao33/minim 1.1、项目介绍&#xff1a; 简单的go写的im服务&#xff0c;流程简单清晰,大部分接口使用的是http&#xff0c;方便流程控制。login服务目前只是用来做服务端推送消息通知到客户端。本…

多音轨视频使用FFmpeg删除不要音轨方法

近期给孩子找宫崎骏动画&#xff0c;但是有很多是多音轨视频但是默认的都是日语&#xff0c;电视上看没办法所以只能下载后删除音轨文件只保留中文。 方法分两步&#xff0c;先安装FFmpeg在转文件即可。 第一步FFmpeg安装 FFmpeg是一个开源项目&#xff0c;包含了处理视频的…

GitHub企业版:AWS CodeCommit迁移的最佳路径与技术优势

此前&#xff0c;亚马逊网路服务&#xff08;AWS&#xff09;宣布&#xff0c;自2024年7月25日起&#xff0c;AWS CodeCommit不再接受新客户。虽然现有客户可以继续使用该服务&#xff0c;且其安全性、可用性和性能将得到维护&#xff0c;但AWS将不再推出新功能或接受新用户。 …

龙旗科技社招入职测评:言语理解材料计算图形推理真题北森题库考什么?

龙旗科技社招入职测评北森题库主要考察以下几个方面&#xff1a; 1. **言语逻辑**&#xff1a;这部分的考试时间是10分钟&#xff0c;需要完成10道题目。每题的作答时间被限定为60秒&#xff0c;一旦提交后无法返回修改。题目类型包括总结中心思想、选词填空和推理文章意思。考…

并发编程中数据的可见性

一、什么是并发编程的可见性&#xff1f; 在并发编程中&#xff0c;“可见性”是指一个线程对共享变量的修改是否能被其他线程及时看到的特性。 二、不可见情况的测试 现在设置成员属性flagtrue&#xff0c;如果flagtrue则t1线程一直死循环执行任务&#xff0c;main线程设置fl…