uni-app開發小程序,根據圖片提取主題色值

需求,在頁面根據傳入的圖片提取圖片主色值并用來設置區塊背景色

<template><view class="icon-container"><view class="sport-icon" :style="{ backgroundColor: mainColor }"><image :src="'/static/images/sport/'+item.image" @load="handleImageLoad" class="li-img" mode="widthFix" /></view><view class="sport-right"><view><text class="sport-name">{{ item.name }}</text></view><view class="sport-text">{{ item.calorie }}千卡/{{ item.unit }}分鐘</view></view><view class="align-self-end"><product-change :selected.sync="item.selected" @onChange="onChange" /></view><!-- Canvas 2D畫布(隱藏) --><canvas type="2d" id="colorCanvas"style="position: absolute; left: -1000px; top: -1000px; width: 100px; height: 100px;"></canvas></view>
</template><script>import productChange from './product-change.vue'export default {name: 'productItem',components: {productChange},props: {name: {type: String,default: ''},item: {type: Object,default: () => {}}},data() {return {imgUrl: '@/static/images/sport/icon-sport-default.png', // 示例圖片mainColor: '#ffffff', // 初始背景色textColor: '#000000', // 文字顏色,根據背景色自動調整canvas: null, // Canvas實例ctx: null // Canvas 2D上下文};},mounted() {console.log(this.item)// 初始化Canvas 2D上下文(在組件掛載后獲取)this.initCanvas();},methods: {onChange() {this.$emit('onChange', {name: this.name,item: this.item})},// 初始化Canvas 2D上下文initCanvas() {// 通過ID獲取Canvas實例(兼容uni-app的獲取方式)const query = uni.createSelectorQuery().in(this);query.select('#colorCanvas').fields({node: true,size: true}).exec(res => {if (!res[0]) {console.error('未找到Canvas元素');return;}this.canvas = res[0].node;this.ctx = this.canvas.getContext('2d'); // 獲取2D上下文// 設置Canvas尺寸(與樣式尺寸一致)this.canvas.width = 100;this.canvas.height = 100;});},// 圖片加載完成后觸發handleImageLoad(e) {if (!this.canvas || !this.ctx) {console.error('Canvas未初始化完成');return;}const imgSrc = "/static/images/sport/" + this.item.image;// 獲取圖片信息(轉為本地路徑)uni.getImageInfo({src: imgSrc,success: (res) => this.drawToCanvas(res.path), // 繪制本地圖片fail: (err) => {console.error('獲取圖片信息失敗:', err);this.useDefaultColor();}});},// 繪制圖片到Canvas(Canvas 2D方式)drawToCanvas(imagePath) {// 創建Image對象(Canvas 2D需要通過Image加載圖片)const img = this.canvas.createImage();if (!imagePath.startsWith('/')) {imagePath = '/' + imagePath;}img.src = imagePath;// 圖片加載完成后繪制到Canvasimg.onload = () => {// 清空畫布(避免殘留舊內容)this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);// 繪制圖片(縮放到100x100,覆蓋整個畫布)this.ctx.drawImage(img, 0, 0, this.canvas.width, this.canvas.height);// 延遲100ms后獲取數據(確保繪制完成)setTimeout(() => this.extractMainColor(), 100);};// 圖片加載失敗處理img.onerror = (err) => {console.error('圖片繪制失敗:', err);this.useDefaultColor();};},// 提取主色extractMainColor() {try {// 讀取Canvas像素數據(Canvas 2D的getImageData)const imageData = this.ctx.getImageData(0, 0, this.canvas.width, this.canvas.height);this.processImageData(imageData.data); // 處理像素數據} catch (err) {console.error('色值提取失敗:{}', err);}},// 處理像素數據,計算主色processImageData(pixelData) {const colorFreq = {}; // 顏色出現頻率let maxFreq = 0;let mainR = 255,mainG = 255,mainB = 255;// 遍歷像素(每4個值為一組:R, G, B, A)for (let i = 0; i < pixelData.length; i += 4) {const r = pixelData[i];const g = pixelData[i + 1];const b = pixelData[i + 2];const a = pixelData[i + 3];// 忽略透明像素(透明度>50%的不統計)if (a < 128) continue;// 顏色量化(減少顏色種類,如每20階合并一次)const key = `${Math.floor(r / 20)}-${Math.floor(g / 20)}-${Math.floor(b / 20)}`;colorFreq[key] = (colorFreq[key] || 0) + 1;// 記錄出現頻率最高的顏色if (colorFreq[key] > maxFreq) {maxFreq = colorFreq[key];mainR = r;mainG = g;mainB = b;}}// 設置主色和文字對比色this.mainColor = `rgb(${mainR}, ${mainG}, ${mainB},0.2)`;// 計算亮度(決定文字顏色)const luminance = (mainR * 299 + mainG * 587 + mainB * 114) / 1000;this.textColor = luminance > 130 ? '#000000' : '#ffffff';},// 使用默認顏色(失敗時)useDefaultColor() {this.mainColor = '#f0f0f0';this.textColor = '#000000';}}}
</script><style lang="scss" scoped>.icon-container {border-bottom: 1px solid #F2F6FC;padding: 20rpx 40rpx;display: flex;}.li-img {// width: 55rpx;// height: 55rpx;}.sport-icon {width: 85rpx;height: 85rpx;padding: 15rpx;border-radius: 20rpx;}.sport-right {flex: 1;margin-left: 25rpx;width: 100%;}.sport-name {font-size: 32rpx;}.sport-text {color: #999;font-size: 26rpx;}.align-self-end {align-self: flex-end}.flex-end {display: flex;flex-direction: column;justify-content: flex-end;}
</style>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/89939.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/89939.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/89939.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ESP32-Cam三腳架機器人:DIY你的智能移動監控平臺

項目概述 在物聯網與機器人技術融合發展的今天&#xff0c;基于ESP32的創意項目層出不窮。今天為大家介紹一款極具創新性的ESP32-Cam三腳架機器人&#xff08;Dodge&#xff09;&#xff0c;它將傳統三腳架結構與智能監控功能完美結合&#xff0c;通過巧妙的機械設計和開源硬件…

Kotlin集合過濾

過濾操作 在處理集合時&#xff0c;根據特定條件過濾集合或檢查集合中是否包含符合特定條件的元素是軟件開發中的常見任務。為了解決這個問題&#xff0c;我們可以使用 Kotlin 中實現的函數式 API。 在本主題中&#xff0c;我們將介紹如何使用謂詞過濾集合&#xff0c;并獲得滿…

14.8 LLaMA2-7B×Dolly-15K實戰:從準確率63%到89%,如何用優質數據讓大模型性能飆升42%?

LLaMA2-7BDolly-15K實戰:從準確率63%到89%,如何用優質數據讓大模型性能飆升42%? 在大模型微調中,“數據質量”往往比“數據數量”更能決定最終效果。Databricks發布的Dolly-15K數據集以“全人工標注+多維度校驗”的特點,成為指令微調的“黃金樣本”——用它微調后的LLaMA…

OpenCV中常用特征提取算法(SURF、ORB、SIFT和AKAZE)用法示例(C++和Python)

OpenCV 中提供了多種常用的特征提取算法&#xff0c;廣泛應用于圖像匹配、拼接、SLAM、物體識別等任務。以下是 OpenCV 中幾個主流特征提取算法的 用法總結與代碼示例&#xff0c;涵蓋 C 和 Python 兩個版本。常用特征提取算法列表算法特點是否需額外模塊SIFT&#xff08;尺度不…

復雜度+包裝類型+泛型

什么是集合框架什么是數據結構什么是算法時間復雜度與空間復雜度的概念時間復雜度的表達方式時間復雜度的大 O 的漸近表示法時間復雜度函數的大小排序包裝類和泛型基本數據類型和對應的包裝類型包裝類型出現的原因什么叫做裝箱&#xff08;裝包&#xff09;和拆箱&#xff08;拆…

硬件設計學習DAY15——自舉電容:MOSFET高端驅動的核心奧秘

每日更新教程&#xff0c;評論區答疑解惑&#xff0c;小白也能變大神&#xff01;" 目錄 一.自舉電容 1.自舉電容的作用 2.自舉電路原理 3.工作過程分析 4.實際應用中的問題 5.關鍵要點 二.自舉電容實現MOSFET高端驅動 2.1MOSFET半橋高端驅動的基本原理 2.2自舉電…

【SpringAI實戰】實現仿DeepSeek頁面對話機器人

一、實現效果 二、代碼實現 2.1 后端代碼 2.2 前端代碼 一、實現效果 可以保存聊天記錄與會話記錄 二、代碼實現 2.1 后端代碼 pom.xml <!-- 繼承Spring Boot父POM&#xff0c;提供默認依賴管理 --><parent><groupId>org.springframework.boot</grou…

RedisJSON 指令精講JSON.STRLEN 高效統計字符串長度

1 場景與價值 在日志累加、指標采集、消息追蹤等場景中&#xff0c;我們常需快速判斷某個字符串字段“到底有多長”&#xff0c;以便&#xff1a; 阻止過大日志&#xff1a;若長度超限則截斷或歸檔&#xff1b;動態分桶&#xff1a;按長度選擇不同存儲策略&#xff1b;性能監控…

大數據量查詢計算引發數據庫CPU告警問題復盤

大數據量查詢計算引發數據庫CPU告警問題復盤一、背景二、根因分析三、解決方案方案1&#xff1a;多線程緩存方案2&#xff1a;利用中間表緩存四、總結一、背景 2025年7月份某天&#xff0c;CDP系統每天不定時推送我們的Portal服務&#xff0c;生產環境運營看板會展示統計數據&…

2025最新版虛幻引擎5(UE5)C++入門教程:前言——你的隨身教程和學習筆記

大家好&#xff0c;我是開發游戲的老王&#xff0c;一名高校教師&#xff0c;我主講游戲開發已有十余年時間&#xff0c;通過我的博客大家應該可以了解我所涉獵的游戲技術范疇非常廣泛&#xff0c;除了Unreal,Unity,Godot等主流游戲引擎&#xff0c;還包括Blender、Houdini、3D…

(3)重定向 | 時間相關指令 | 文件查找 | 打包與壓縮

Ⅰ . 初始重定向01 輸出重定向 >在上一節中我們為了方便講解 head 和 tail 指令&#xff0c;我們用到了 > 去生成了一千行文本。通過 > 將生成的一千行文本寫入到了 large.txt 中……我們現在來正式介紹一下&#xff1a;$ echo "內容" > [目標] 本來應…

DTH11測量溫濕度學習(第十一天)

&#x1f468;?&#x1f4bb;個人主頁&#xff1a;開發者-削好皮的Pineapple! &#x1f468;?&#x1f4bb; hello 歡迎 點贊&#x1f44d; 收藏? 留言&#x1f4dd; 加關注?! &#x1f468;?&#x1f4bb; 本文由 削好皮的Pineapple! 原創 &#x1f468;?&#x1f4…

Go語言初識--標識符 可見性

Go語言初識–標識符 可見性 和C語言相似&#xff0c;go語言的基本組成有&#xff1a; 包聲明&#xff0c;編寫源文件時&#xff0c;必須在非注釋的第一行指明這個文件屬于哪個包&#xff0c;如package main。引入包&#xff0c;其實就是告訴Go 編譯器這個程序需要使用的包&…

Python實例之畫小豬佩奇

效果圖&#xff1a;python代碼以及解釋&#xff0c;沒有運用模塊。 """ 繪制小豬佩奇 """ from turtle import *def nose(x,y):"""畫鼻子"""penup()# 將海龜移動到指定的坐標goto(x,y)pendown()# 設置海龜的方向&…

Unity筆記——事件中心

事件中心是什么事件中心是 Unity 游戲開發中常用的架構設計&#xff0c;它基于觀察者模式 或 發布-訂閱模式&#xff0c;通過委托和事件構建的一種消息管理系統。主要用于降低代碼耦合度&#xff0c;實現模塊間的松耦合通信的消息處理系統能大幅提升代碼的可維護性和擴展性&…

Java: 反射機制的 ParameterizedType(參數化類型)

在 Java 中&#xff0c;ParameterizedType 是 java.lang.reflect 包下的一個接口&#xff0c;屬于反射 API 的一部分&#xff0c;主要用于表示參數化類型&#xff08;即帶有類型參數的泛型類型&#xff09;。它是 Java 反射機制中處理泛型類型信息的關鍵接口之一。 一、什么是參…

OkHttp 與 Retrofit 完美結合:打造高效的 Android 網絡請求

前言在現代 Android 開發中&#xff0c;網絡請求是幾乎每個應用都必不可少的功能。OkHttp 和 Retrofit 作為當前最流行的網絡請求庫組合&#xff0c;為開發者提供了簡潔高效的解決方案。本文將詳細介紹如何將這兩者結合使用&#xff0c;充分發揮它們的優勢。一、OkHttp 和 Retr…

系統辨識建模

系統辨識建模 一、系統辨識建模的作用 1. 建立真實物理系統的數學模型 2. 為后續控制器/強化學習算法提供仿真環境 3. 提高控制精度和安全性 二、本文的系統辨識是怎么做的 1. 實驗采集 2. 數學建模 3. 在控制系統中的作用 三、實際用法流程(簡化版) 1. 系統辨識階段 2. 強化…

Android開發:Java與Kotlin深度對比

1. 語言特性與現代性 Java (特別是 Android 主要使用的 Java 8 及之前版本): 相對冗長&#xff1a; 需要編寫更多的樣板代碼&#xff08;如 getter/setter、findViewById 的顯式類型轉換、匿名內部類等&#xff09;。空指針異常 (NPE)&#xff1a; 類型系統默認允許 null&#…

米家打印機驅動:Wi-Fi 無線打印絲滑順暢不卡頓,從此告別對打印機干瞪眼

各位小米家居控們&#xff0c;你們有沒有過這種經歷&#xff0c;新買的打印機回家&#xff0c;結果電腦跟它像倆傲嬌的小情侶&#xff0c;死活不搭話&#xff1f;急得你想當場表演一個“打印機抱頭痛哭”&#xff1f;別急&#xff0c;今天就給你們安利個神隊友——米家打印機驅…