可可圖片編輯 HarmonyOS(5)濾鏡效果

可可圖片編輯 HarmonyOS(5)濾鏡效果

前言

可可圖片編輯也實現了濾鏡效果,主要是利用 Image組件的 colorFilter 屬性實現。

image-20250912193041758


image-20250912195641367

濾鏡的關鍵屬性 colorFilter

colorFilter 的主要作用是給圖像設置顏色濾鏡效果。

其核心原理是使用一個 4x5 的顏色矩陣 對圖片的每個像素顏色(RGBA)進行數學變換,從而得到一個新的顏色值。

參數類型:

colorFilter(value: ColorFilter | DrawingColorFilter)

它接受兩種類型的參數:

  1. ColorFilter: ArkUI 自帶的顏色濾鏡對象,主要通過傳遞一個 4x5 的矩陣數組來使用。

  2. DrawingColorFilter: 來自 @kit.ArkGraphics2D

    繪圖模塊的、功能更豐富的顏色濾鏡對象,提供了多種靜態創建方法(如混合模式、矩陣、光照等)。

使用方法 1 :使用 ColorFilter 和 4x5 顏色矩陣

這是最基礎和最靈活的方式。你需要構造一個包含 20 個數字的數組來表示一個 4x5 的矩陣。

image-20250912200608965

1. 矩陣計算規則

矩陣結構如下,它會對每個像素的原始顏色 [R, G, B, A] 進行運算:

輸出顏色 [R', G', B', A'] 的計算公式為:

R' = r1*R + r2*G + r3*B + r4*A + r5 * 255
G' = g1*R + g2*G + g3*B + g4*A + g5 * 255
B' = b1*R + b2*G + b3*B + b4*A + b5 * 255
A' = a1*R + a2*G + a3*B + a4*A + a5 * 255

重要提示:計算時,原始顏色值(R,G,B,A)需要先歸一化(Normalize)到 [0.0, 1.0] 的浮點數范圍(1.0 對應 255)。

示例代碼:

后續的效果都可以在當前示例代碼上進行修改

@Entry
@Component
struct Index {private grayMatrix: number[] =// 冷色調 (增強藍色和青色)[0.9, 0, 0, 0, 0, // 略微減弱紅色0, 1.0, 0, 0, 0,0, 0, 1.2, 0, 0, // 增強藍色0, 0, 0, 1, 0]private grayFilter: ColorFilter = new ColorFilter(this.grayMatrix);build() {Column({ space: 20 }) {// 原始圖片Image($r('app.media.startIcon')).width(100).height(100)// 使用 ColorFilter 矩陣Image($r('app.media.app_icon')).width(100).height(100).colorFilter(this.grayFilter)}.width('100%').height('100%').justifyContent(FlexAlign.Center)}
}

2. 常用矩陣示例

a) 原圖效果(單位矩陣) 保持圖片原有色彩,不對其做任何改變。

image-20250912200657027

// 單位矩陣
[1, 0, 0, 0, 0,0, 1, 0, 0, 0,0, 0, 1, 0, 0,0, 0, 0, 1, 0]

b) 灰度效果 將圖片轉換為黑白灰度圖。常見的權重公式是 0.299*R + 0.587*G + 0.114*B

image-20250912200721306

[0.299, 0.587, 0.114, 0, 0,0.299, 0.587, 0.114, 0, 0,0.299, 0.587, 0.114, 0, 0,0,     0,     0,     1, 0]

c) 顏色反轉(負片效果) 將每個顏色通道取反。

image-20250912200746913

[-1, 0, 0, 0, 1,0,-1, 0, 0, 1,0, 0,-1, 0, 1,0, 0, 0, 1, 0]

d) 純色著色(文檔中的核心方案) 忽略原圖顏色,將其渲染為指定的目標顏色(例如 #4f0f48db)。

image-20250912200834837

  • 將 RGB 通道的前四列系數設為 0,完全丟棄原圖顏色信息。
  • 將 RGB 通道的第五列設置為目標顏色歸一化后的。
  • Alpha 通道通常保持不變。

假設目標色為 #4f0f48db,其歸一化后的值為:

  • A = 0.31 (79/255)
  • R = 0.06 (15/255)
  • G = 0.28 (72/255)
  • B = 0.86 (219/255)

對應的矩陣為:

[0, 0, 0, 0, 0.06, // R' = 0 + 0.06*2550, 0, 0, 0, 0.28, // G' = 0 + 0.28*2550, 0, 0, 0, 0.86, // B' = 0 + 0.86*2550, 0, 0, 1, 0]    // A' = Original A

e) 棕褐色懷舊效果 (Sepia) ,這是一種經典的老照片效果,為圖像添加溫暖的棕褐色調。

image-20250912201219272

[0.393, 0.769, 0.189, 0, 0,0.349, 0.686, 0.168, 0, 0,0.272, 0.534, 0.131, 0, 0,0,     0,     0,     1, 0
]

f) 亮度調節,整體提升或降低圖像的亮度。

image-20250912202852982

// 調整 brightness 值,范圍通常在 -1.0 到 1.0 之間
// 正數變亮,負數變暗
const brightness = 0.3; // 增加30%的亮度[1, 0, 0, 0, brightness,0, 1, 0, 0, brightness,0, 0, 1, 0, brightness,0, 0, 0, 1, 0
]

g) 冷色調/暖色調 通過微調不同顏色通道的增益,營造冷暖感覺.

image-20250912202918160

// 暖色調 (增強紅色和黃色)
[1.2, 0, 0, 0, 0,0, 1.1, 0, 0, 0,0, 0, 0.9, 0, 0, // 略微減弱藍色0, 0, 0, 1, 0
]// 冷色調 (增強藍色和青色)
[0.9, 0, 0, 0, 0, // 略微減弱紅色0, 1.0, 0, 0, 0,0, 0, 1.2, 0, 0, // 增強藍色0, 0, 0, 1, 0
]

使用方法 2 :使用 DrawingColorFilter(推薦,更簡單)

通過 '@kit.ArkGraphics2D' 模塊提供的多種靜態方法創建濾鏡,這種方式通常更簡潔易懂。

1. 導入模塊

import { drawing } from '@kit.ArkGraphics2D';

2. 使用預置方法創建濾鏡

a) 創建混合模式濾鏡 (createBlendModeColorFilter)

使用指定的顏色和混合模式(如 BlendMode.SRC_IN)進行混合,非常適合著色。

image-20250912203418225

import { drawing } from '@kit.ArkGraphics2D';// 創建一個紅色的,采用 SRC_IN 混合模式的濾鏡
// SRC_IN: 最終顏色由源顏色(這里指紅色)和目標區域的Alpha共同決定,常用于著色
let colorFilter = drawing.ColorFilter.createBlendModeColorFilter({alpha: 255,red: 255,green: 0,blue: 0}, // 顏色對象,這里是紅色drawing.BlendMode.SRC_IN
);@Entry
@Component
struct Index {build() {Column({ space: 20 }) {// 原始圖片Image($r('app.media.startIcon')).width(100).height(100)Image($r('app.media.startIcon')).width(100).height(100).colorFilter(colorFilter)}.width('100%').height('100%').justifyContent(FlexAlign.Center)}
}

b) 直接通過矩陣創建 (createMatrixColorFilter)

與原生 ColorFilter 類似,但使用 drawing 模塊的接口。

image-20250912203349690

import { drawing } from '@kit.ArkGraphics2D';let matrix = [0.299, 0.587, 0.114, 0, 0,0.299, 0.587, 0.114, 0, 0,0.299, 0.587, 0.114, 0, 0,0, 0, 0, 1, 0
];
let grayFilter = drawing.ColorFilter.createMatrixColorFilter(matrix);@Entry
@Component
struct Index {build() {Column({ space: 20 }) {// 原始圖片Image($r('app.media.startIcon')).width(100).height(100)Image($r('app.media.startIcon')).width(100).height(100).colorFilter(grayFilter)}.width('100%').height('100%').justifyContent(FlexAlign.Center)}
}

注意事項

性能:顏色濾鏡的運算發生在渲染時,對于大圖或頻繁操作,可能會有性能開銷。建議對處理后的結果進行緩存。

Alpha 通道:在處理透明度時務必小心,錯誤的矩陣設置可能導致圖片完全透明或出現非預期的半透明效果。

對于簡單的顏色覆蓋/著色,優先推薦使用 drawing.ColorFilter.createBlendModeColorFilter,它的代碼更簡潔,意圖更

清晰。對于復雜的顏色變換(如復古、色調分離等),再考慮使用自定義矩陣。

以往文章

  • 我的iMaHarmonyOS 知識庫接入 鴻蒙6 API20 新特性了

    https://mp.weixin.qq.com/s/YsbFQyi5PsndpRUaA9h_dA?token=830743671&lang=zh_CN

  • 鴻蒙創新賽 HarmonyOS 6.0.0(20) 關鍵特性匯總

    https://mp.weixin.qq.com/s/ERmgSAIT8B8njFqtyPx9IQ

  • 可可圖片編輯 HarmonyOS(4)圖片裁剪-canvas

    https://mp.weixin.qq.com/s/2M3f_LNnt0YRo0qEnCnqpA

  • 可可圖片編輯 HarmonyOS(3)應用間分享圖片

    https://mp.weixin.qq.com/s/n8kkdougB4lqDHjYC7co8g

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

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

相關文章

< JS事件循環系列【二】> 微任務深度解析:從本質到實戰避坑

在上一篇關于 JS 事件循環的文章中,我們提到 “微任務優先級高于宏任務” 這一核心結論,但對于微任務本身的細節并未展開。作為事件循環中 “優先級最高的異步任務”,微任務的執行機制直接影響代碼邏輯的正確性,比如Promise.then的…

STM32 單片機開發 - SPI 總線

一、SPI 總線概念SPI 總線 --- Serial Peripheral Interface,即串行外設接口SPI 是摩托羅拉公司設計的一款 串行、同步、全雙工總線;SPI 總線是三線 / 四線制總線,分別是:SPI_SCK(時鐘線)、S…

區域醫院云HIS系統源碼,云醫院管理系統源碼,云診所源碼

云HIS源碼,云醫院管理系統源碼,云診所源碼,二級專科醫院云HIS系統源代碼,有演示云HIS,即云醫院管理系統,是一種運用云計算、大數據、物聯網等新興信息技術的醫療信息化解決方案。它重新定義了傳統的醫院信息…

Java基礎 9.11

1.第三代日期類前面兩代日期類的不足分析JDK 1.0中包含了一個java.uti.Date類,但是它的大多數方法已經在JDK1.1引Calendar類之后被棄用了。而Calendar也存在問題是:可變性:像日期和時間這樣的類應該是不可變的偏移性:Date中的年份…

JavaScript 數組過濾方法

在 JavaScript 編程中,數組是最常用的數據結構之一,而數組過濾則是處理數據集合的關鍵操作。filter() 方法提供了一種高效的方式來從數組中篩選出符合特定條件的元素,返回一個新的數組,而不改變原始數組。這種方法在處理對象數組時…

《sklearn機器學習——數據預處理》離散化

sklearn 數據預處理中的離散化(Discretization) 離散化是將連續型數值特征轉換為離散區間(分箱/bins)的過程,常用于簡化模型、增強魯棒性、處理非線性關系或滿足某些算法對離散輸入的要求(如樸素貝葉斯、決…

PTA算法簡析

ArkAnalyzer源碼初步分析I:https://blog.csdn.net/2302_80118884/article/details/151627341?spm1001.2014.3001.5501 首先,我們必須明確 PTA 的核心工作:它不再關心變量的“聲明類型”,而是為程序中的每一個變量和每一個對象字段…

Vue 3 中監聽多個數據變化的幾種方法

1. 使用 watch監聽多個 ref/reactive 數據import { ref, watch } from vueexport default {setup() {const count ref(0)const name ref()const user reactive({ age: 20 })// 監聽多個數據源watch([count, name, () > user.age], // 數組形式傳入多個數據源([newCount, …

第 2 篇:Java 入門實戰(JDK8 版)—— 編寫第一個 Java 程序,理解基礎運行邏輯

用 IntelliJ IDEA 寫第一個 Java 8 程序:Hello World 實操指南 作為 Java 初學者,“Hello World” 是你接觸這門語言的第一個里程碑。本文會聚焦 Java 8(經典 LTS 版本,企業級開發常用) 和 IntelliJ IDEA(當…

【GPT入門】第67課 多模態模型實踐: 本地部署文生視頻模型和圖片推理模型

【GPT入門】第67課 多模態模型實踐: 本地部署文生視頻模型和圖片推理模型1. 文生視頻模型CogVideoX-5b 本地部署1.1 模型介紹1.2 環境安裝1.3 模型下載1.4 測試2.ollama部署圖片推理模型 llama3.2-vision2.1 模型介紹2.2 安裝ollama2.3 下載模型2.4 測試模型2.5 測試…

C++初階(6)類和對象(下)

1. 再談構造函數(構造函數的2個深入使用技巧) 1.1 構造函數體賦值 在創建對象時,編譯器通過調用構造函數,給對象中各個成員變量一個合適的初始值。 雖然上述構造函數調用之后,對象中已經有了一個初始值,…

容器文件描述符熱遷移在云服務器高可用架構的實施標準

在云計算環境中,容器文件描述符熱遷移技術正成為保障業務連續性的關鍵解決方案。本文將深入解析該技術在云服務器高可用架構中的實施標準,涵蓋技術原理、實現路徑、性能優化等核心維度,為構建穩定可靠的容器化基礎設施提供系統化指導。 容器文…

毫米波雷達液位計如何遠程監控水位?

引言毫米波雷達液位計作為一種高精度、非接觸式的水位監測設備,正逐漸成為智慧水務、環境監測等領域的關鍵工具。其通過先進的調頻連續波(FMCW)技術,實現5mm的測量精度,并支持多種遠程通信方式,使用戶能夠實…

關于 C++ 編程語言常見問題及技術要點的說明

關于 C 編程語言常見問題及技術要點的說明C 作為一門兼具高效性與靈活性的靜態編譯型編程語言,自 1985 年正式發布以來,始終在系統開發、游戲引擎、嵌入式設備、高性能計算等領域占據核心地位。隨著 C 標準(如 C11、C17、C20)的持…

【Qt QSS樣式設置】

Qt中的QSS樣式設置流程 Qt Style Sheets (QSS) 是Qt框架中用于自定義控件外觀的樣式表語言,其語法類似于CSS。以下是QSS的設置流程和示例。 QSS設置流程 1. 創建QSS樣式表文件或字符串 首先,需要創建QSS樣式表,可以是一個單獨的.qss文件&…

使用 Apollo TransformWrapper 生成相機到各坐標系的變換矩陣

使用 Apollo TransformWrapper 生成相機到各坐標系的變換矩陣一、背景二、原理1、什么是變換矩陣?2、為什么需要變換矩陣?3、Apollo 中的坐標系4、Apollo TransformWrapper三、操作步驟1. 設置車輛參數2. 啟動靜態變換發布3. 查看變換信息4. 播放記錄數據…

硬件(十)IMX6ULL 中斷與時鐘配置

一、OCP 原則(開閉原則)對代碼擴展是開放的,允許通過新增代碼來擴展功能;對代碼的修改是關閉的,盡量避免直接修改已有穩定運行的代碼,以此保障代碼的穩定性與可維護性。二、中斷處理(一&#xf…

打工人日報#20250913

打工人日報#20250913 周六,回杭州了,這邊居然下雨。 閱讀 《小米創業思考》 第七章 技術為本 其中的技術介紹算是比較詳細的,架構也很清晰,有一種對自己家產品如數家珍的感覺,對于架構也是經常思考的感覺感恩 和namwei…

【面試題】RAG核心痛點

1. 文檔切分粒度不好把控,既擔心噪聲太多又擔心語義信息丟失 這是一個經典難題。切分粒度過大,單個chunk包含過多無關信息(噪聲),會干擾LLM理解核心內容;切分過小,則可能割裂句子或段落的完整語…

網絡安全與iptables防火墻配置

iptables基本概念iptables是Linux系統中強大的防火墻工具,它工作在用戶空間,通過命令行界面與內核空間的netfilter框架交互,實現數據包過濾、網絡地址轉換(NAT)等功能。Web服務器防火墻配置實例以下是針對Web服務器的iptables配置步驟&#x…