可可圖片編輯 HarmonyOS(4)圖片裁剪

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

前言

可可圖片編輯 實現了圖片的裁剪功能,效果如圖所示。這里的核心技術是使用了canvas。

image-20250826230645973

Canvas 入門

Canvas提供畫布組件,用于自定義繪制圖形,開發者使用CanvasRenderingContext2D對象和OffscreenCanvasRenderingContext2D對象在Canvas組件上進行繪制,繪制對象可以是基礎形狀、文本、圖片等,canvas也可以實現對圖片到裁剪,并且還可以把canvas上描繪的圖形下載保存成圖片。本章節主要講解下canvas的基本使用。

基本使用

canvas 的基本使用分為 4 步:

  1. 設置是否抗鋸齒抗鋸齒(Anti - aliasing)是一種在數字圖形處理中使用的技術,主要用于減少圖像中因為像素有限而產生的鋸齒狀邊緣的現象
  2. 創建畫布上下文
  3. 渲染畫布組件
  4. 在畫布上描繪圖案
@Entry
@Component
struct Index {// 1 用來配置CanvasRenderingContext2D對象的參數,包括是否開啟抗鋸齒,true表明開啟抗鋸齒。private settings: RenderingContextSettings = new RenderingContextSettings(true)// 2 用來創建CanvasRenderingContext2D對象,通過在canvas中調用CanvasRenderingContext2D對象來繪制。private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)build() {// 3 在canvas中調用CanvasRenderingContext2D對象。Column(){Canvas(this.context).width('100%').height('100%').backgroundColor('#F5DC62').onReady(() => {// 4 可以在這里繪制內容。this.context.strokeRect(50, 50, 200, 150);})}.width('100%').height('100%').justifyContent(FlexAlign.Center)}
}
  1. 效果

image-20250104222001043

canvas 常見用法

canvas 的核心思想是將想要的圖形如,直線、圓圈、矩形等圖形描繪到畫布上。如果想要呈現出比較酷炫的效果,做法是:

  1. 描繪圖形
  2. 擦除畫布
  3. 計算數值-重新描繪圖形
  4. 擦除畫布
  5. 。。。

通過以上過程實現動畫效果

image-20250104223622772

canvas 的坐標系

在 canvas 中畫圖形都是基于坐標系來進行的。 左上角為起點。

image-20250104224722034

描繪圖形

canvas 中內置的常見的描繪圖形的方法有以下:

  1. 直線
  2. 矩形
  3. 弧形
  4. 文本
  5. 圖像

直線

描繪直線可以使用:

  1. 定起點 moveTo
  2. 定終點 lineTo
  3. 開始描繪 stroke
this.context.moveTo(10, 10);
this.context.lineTo(100, 100);
this.context.stroke();

image-20250104224216771

矩形

可以使用直線lineTo自己畫成一個矩形。也可以直接使用 strokeRect直接生成矩形

lineTo 畫矩形

this.context.moveTo(10, 10);
this.context.lineTo(300, 10);
this.context.lineTo(300, 300);
this.context.lineTo(10, 300);
//   自動閉環
this.context.closePath();
//   開始描述 將路徑的當前點移回到路徑的起點,當前點到起點間畫一條直線
this.context.stroke();

image-20250104225516822

strokeRect 畫矩形

// this.context.strokeRect(x, y, 寬度, 高度);
this.context.strokeRect(50, 50, 200, 150);

image-20250104225643875

弧形

弧形可以使用 arcarcTo 來描繪

arc

arc(x: number, y: number, radius: number, startAngle: number, endAngle: number, counterclockwise?: boolean)

參數名類型必填說明
xnumber弧線圓心的 x 坐標值。默認單位:vp。
ynumber弧線圓心的 y 坐標值。默認單位:vp。
radiusnumber弧線的圓半徑。默認單位:vp。
startAnglenumber弧線的起始弧度。單位:弧度
endAnglenumber弧線的終止弧度。單位:弧度
counterclockwiseboolean是否逆時針繪制圓弧。true:逆時針方向繪制橢圓。false:順時針方向繪制橢圓。默認值:false。

這里需要注意的是 arc 使用的單位是弧度不是角度

一圈 = 360角度 =  2 * Math.PI
半圈 = 180角度 =  Math.PI ≈ 3.14

觀察以下效果

image-20250104230514600

100,75 是圓心坐標

50 是半徑

0 是開始的弧度

6.28 ≈ 2 * Math.PI = 一圈


arc 是從正右方向開始旋轉的。

this.context.beginPath();
this.context.arc(100, 75, 50, 0, 3.14 / 2);
this.context.stroke();

image-20250104230945457

arcTo

arcTo(x1: number, y1: number, x2: number, y2: number, radius: number)

參數名類型必填說明
x1number第一個控制點的 x 坐標值。默認單位:vp。
y1number第一個控制點的 y 坐標值。默認單位:vp。
x2number第二個控制點的 x 坐標值。默認單位:vp。
y2number第二個控制點的 y 坐標值。默認單位:vp。
radiusnumber圓弧的圓半徑值。默認單位:vp。

image-20250104235451185

this.context.beginPath();
this.context.strokeStyle = "#000000";
this.context.lineWidth = 3;
this.context.moveTo(360, 20);
this.context.arcTo(360, 170, 110, 170, 150);
this.context.stroke();

輔助理解

想象一下,我們有一個起點(即當前路徑的最后一個點),然后有三個更多的點:兩個控制點 (x1, y1) 和 (x2, y2),以及由 radius

定義的一個圓心。arcTo 會創建一條從起點到第二個控制點 (x2, y2) 的圓弧,這條圓弧是位于以 radius 為半徑的圓周上的一部

分。該圓弧會在起點和第一個控制點 (x1, y1) 之間形成一個切線,并且也會在第二個控制點 (x2, y2) 和圓弧的終點之間形成一個切線。

image-20250104234845265

文本

  1. strokeText表示描邊的圖形
  2. fillText 表示填充的圖形,還有其他fillfillRect等也表示填充。

strokeText

  this.context.font = '55px sans-serif'this.context.strokeText("Hello World!", 20, 60)

image-20250104235533508

fillText

this.context.font = '55px sans-serif'
this.context.fillText("Hello World!", 20, 60)

image-20250104235642059

圖像

drawImage可以把圖像描繪到畫布上,很多的在線圖形合成效果都可以利用該功能實現

drawImage(image: ImageBitmap | PixelMap, dx: number, dy: number): void

drawImage(image: ImageBitmap | PixelMap, dx: number, dy: number, dw: number, dh: number): void

drawImage(image: ImageBitmap | PixelMap, sx: number, sy: number, sw: number, sh: number, dx: number, dy: number, dw: number, dh: number): void

參數名類型必填說明
imageImageBitmap或PixelMap圖片資源,請參考 ImageBitmap 或 PixelMap。
sxnumber裁切源圖像時距離源圖像左上角的 x 坐標值。image 類型為 ImageBitmap 時,默認單位:vp。image 類型為 PixelMap 時,單位:px。
synumber裁切源圖像時距離源圖像左上角的 y 坐標值。image 類型為 ImageBitmap 時,默認單位:vp。image 類型為 PixelMap 時,單位:px。
swnumber裁切源圖像時需要裁切的寬度。image 類型為 ImageBitmap 時,默認單位:vp。image 類型為 PixelMap 時,單位:px。
shnumber裁切源圖像時需要裁切的高度。image 類型為 ImageBitmap 時,默認單位:vp。image 類型為 PixelMap 時,單位:px。
dxnumber繪制區域左上角在 x 軸的位置。默認單位:vp。
dynumber繪制區域左上角在 y 軸的位置。默認單位:vp。
dwnumber繪制區域的寬度。當繪制區域的寬度和裁剪圖像的寬度不一致時,將圖像寬度拉伸或壓縮為繪制區域的寬度。默認單位:vp。
dhnumber繪制區域的高度。當繪制區域的高度和裁剪圖像的高度不一致時,將圖像高度拉伸或壓縮為繪制區域的高度。默認單位:vp。
@Entry
@Component
struct Index {private settings: RenderingContextSettings = new RenderingContextSettings(true)private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)private img: ImageBitmap = new ImageBitmap("/images/example.jpg")build() {Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {Canvas(this.context).width('100%').height('100%').backgroundColor('#ffff00').onReady(() => {this.context.drawImage(this.img, 0, 0)this.context.drawImage(this.img, 0, 150, 300, 100)this.context.drawImage(this.img, 0, 0, 500, 500, 0, 300, 400, 200)})}.width('100%').height('100%')}
}

image-20250105000141244

canvas 淺嘗動態效果 1

const width = px2vp(display.getDefaultDisplaySync().availableWidth) * 0.9;
const height = width;
let x = 0;
let y = 0;
setInterval(() => {this.context.strokeRect(x, y, 100, 100);x++;y++;
}, 20);

PixPin_2025-01-05_00-07-08

canvas 淺嘗動態效果 2

const width = px2vp(display.getDefaultDisplaySync().availableWidth) * 0.9;
const height = width;
let x = 0;
let y = 0;
setInterval(() => {// 清理畫布this.context.strokeRect(x, y, 100, 100);x++;y++;
}, 20);

PixPin_2025-01-05_00-08-20

canvas 屬性 一覽

名稱說明
fillStyle設置繪制的填充色,支持多種類型及對應創建方式,有默認值。
lineWidth設置繪制線條的寬度,有默認值及取值限制。
strokeStyle設置線條的顏色,支持多種類型及對應創建方式,有默認值。
lineCap指定線端點的樣式,有可選值及默認值。
lineJoin指定線段間相交的交點樣式,有可選值及默認值。
miterLimit設置斜接面限制值,有默認值及取值限制。
font設置文本繪制中的字體樣式,包含多種可選參數及默認值。
textAlign設置文本繪制中的文本對齊方式,有可選值及默認值。
textBaseline設置文本繪制中的水平對齊方式,有可選值及默認值。
globalAlpha設置透明度,有默認值。
lineDashOffset設置畫布的虛線偏移量,有默認值。
globalCompositeOperation設置合成操作的方式,有可選值及默認值。
shadowBlur設置繪制陰影時的模糊級別,有默認值及取值限制。
shadowColor設置繪制陰影時的陰影顏色,有默認值。
shadowOffsetX設置繪制陰影時和原有對象的水平偏移值,有默認值。
shadowOffsetY設置繪制陰影時和原有對象的垂直偏移值,有默認值。
imageSmoothingEnabled設置繪制圖片時是否進行圖像平滑度調整,有默認值。
height表示組件高度,有默認單位。
width表示組件寬度,有默認單位。
imageSmoothingQuality設置圖像平滑度,有默認值。
direction設置繪制文字時使用的文字方向,有默認值。
filter設置圖像的濾鏡,支持多種濾鏡效果,有默認值。
canvas獲取和 CanvasRenderingContext2D 關聯的 Canvas 組件的 FrameNode 實例,
可監聽可見狀態,默認值為 null。

canvas 方法 一覽

名稱說明
fillRect推測用于進行圖形填充相關操作(通常是填充矩形區域)
strokeRect推測用于繪制矩形邊框相關操作(通常是繪制矩形的輪廓)
clearRect推測用于清除指定矩形區域的內容
fillText推測用于對文本進行填充操作(比如設置文本填充顏色等相關樣式填充)
strokeText推測用于繪制文本的輪廓相關操作
measureText推測用于測量文本相關的尺寸等屬性
stroke一般用于繪制圖形的輪廓、線條等(按常規語義理解)
beginPath通常用于開始定義一個新的路徑,后續可基于此路徑進行圖形繪制等操作
moveTo常用來將畫筆移動到指定坐標位置,作為繪制路徑的起始點等操作
lineTo一般用于從當前畫筆位置繪制直線到指定坐標位置,構建路徑內容
closePath通常用于閉合當前正在繪制的路徑,使路徑形成封閉圖形
createPattern可能用于創建某種圖案(比如重復平鋪的圖案等)用于繪制等
bezierCurveTo大概率用于繪制貝塞爾曲線,通過控制點來定義曲線形狀
quadraticCurveTo推測用于繪制二次貝塞爾曲線,指定控制點來確定曲線走向
arc一般用于繪制圓弧,通過圓心、半徑、起始角度、結束角度等參數來定義
arcTo常用來繪制與兩條切線相切的圓弧,按給定條件確定圓弧形狀
ellipse用于繪制橢圓圖形,需指定相關參數如圓心坐標、長半軸、短半軸等
rect可用于繪制矩形,指定矩形的左上角坐標、寬度、高度等參數
fill用于對已繪制的圖形或者指定區域進行填充操作
clip可能用于設置裁剪區域,后續繪制內容只在裁剪區域內顯示
reset12+從名稱看可能是在特定版本(12+)中用于重置某些狀態或設置的操作
saveLayer12+在特定版本(12+)里可能用于保存圖層相關狀態等操作
restoreLayer12+在特定版本(12+)里對應于之前保存圖層狀態進行恢復的操作
resetTransform推測用于重置圖形變換相關的設置(比如旋轉、縮放等變換)
rotate用于將圖形進行旋轉操作,需指定旋轉角度等參數
scale用于對圖形進行縮放操作,指定橫向和縱向的縮放比例
transform一般用于對圖形進行多種變換(如平移、旋轉、縮放等組合變換)的設置
setTransform可能用于設置圖形的變換矩陣,來確定圖形的變換情況
getTransform推測用于獲取當前圖形的變換相關信息(比如變換矩陣等)
translate用于將圖形進行平移操作,指定在橫、縱坐標方向平移的距離
drawImage通常用于在畫布上繪制圖像,指定圖像源及繪制位置等參數
createImageData可能用于創建圖像數據對象(比如像素數據等相關內容)
getPixelMap推測用于獲取像素映射相關的數據(比如圖像像素的分布等情況)
setPixelMap大概是用于設置像素映射相關數據,改變圖像像素表現等
getImageData一般用于獲取圖像的像素數據等具體信息內容
putImageData通常是將獲取到的圖像數據(如像素數據)重新應用到畫布等位置
setLineDash可能用于設置線條的虛線樣式,指定虛線的長度、間隔等參數
getLineDash推測用于獲取當前線條所設置的虛線樣式相關參數
transferFromImageBitmap從名稱看可能是與從圖像位圖進行數據轉移相關操作
toDataURL通常用于將畫布等內容轉換為可以表示圖像數據的 URL 格式
restore一般用于恢復之前保存的某些狀態(如畫布狀態等)
save常用來保存當前畫布等相關的狀態,以便后續恢復使用
createLinearGradient用于創建線性漸變對象,可用于圖形的漸變填充等操作
createRadialGradient用于創建徑向漸變對象,定義從中心向外擴散的漸變效果
createConicGradient用于創建圓錐漸變對象,實現類似圓錐形狀的漸變效果

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

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

相關文章

怎么用PS制作1寸證件照(已解決)

方法/步驟一、按住鍵盤上的“Ctrl”“O”打開你要制作的照片二、點擊裁剪工具 (調整為寬:2.5cm,高:3.5cm,分辨率:300像素),設置之后直接框選出需要剪切保留的位置(使人物居正中), 然后按上面的“√”,以便確認剪裁三、…

Qt libcurl的下載、配置及簡單測試 (windows環境)

Qt libcurl的下載、配置及簡單測試引言一、libcurl下載二、在Qt Creator中配置三、簡單測試引言 curl(Client URL)是一個開源的命令行工具和庫,用于傳輸數據支持多種協議(如HTTP、HTTPS、FTP、SFTP等)。其核心庫libcur…

【Python語法基礎學習筆記】競賽常用標準庫

前言此系列筆記是撥珠自己的學習筆記,自用為主,學習建議移步其他大佬的專門教程。math庫Python 的 math 庫是標準庫之一,提供了大量數學運算相關的函數,適用于基礎數學計算、科學計算等場景。下面詳細介紹其使用方法及常用功能&am…

我的項目我做主:Focalboard+cpolar讓團隊協作擺脫平臺依賴

文章目錄前言1. 使用Docker本地部署Focalboard1.1 在Windows中安裝 Docker1.2 使用Docker部署Focalboard2. 安裝Cpolar內網穿透工具3. 實現公網訪問Focalboard4. 固定Focalboard公網地址前言 “項目管理軟件又漲價了!“小團隊負責人小林發愁——剛習慣操作邏輯&…

【3D 入門-4】trimesh 極速上手之 3D Mesh 數據結構解析(Vertices / Faces)

【3D入門-指標篇上】3D 網格重建評估指標詳解與通俗比喻【3D入門-指標篇下】 3D重建評估指標對比-附實現代碼【3D 入門-3】常見 3D 格式對比,.glb / .obj / .stl / .ply Mesh 數據結構解析 1. Vertices(頂點) original_vertices mesh_ful…

無需服務器,免費、快捷的一鍵部署前端 vue React代碼--PinMe

作為前端的開發,有時候想部署一個項目真的是很“受氣”,要不就是找運維,或者后端,看別人的時間,或者走流程。 現在,有這么一個神器PinMe, 以前部署項目:自己買服務器?域名、 SSL、N…

【LeetCode_26】刪除有序數組中的重復項

刷爆LeetCode系列LeetCode26題:github地址前言題目描述題目與思路分析代碼實現算法代碼優化LeetCode26題: github地址 有夢想的電信狗 前言 本文介紹用C實現leetCode第26題題目鏈接:https://leetcode-cn.com/problems/remove-duplicates-…

CMake構建學習筆記23-SQLite庫的構建

1. 構建思路 在前文中構建了大量的庫包程序(參看CMake構建學習筆記-目錄)之后,可以總結一下在Windows下使用腳本構建程序的辦法: 使用CMake構建。這是目前最通用最流行的構建方式,大部分C/C程序都在逐漸向這個方向轉…

Watt Toolkit下載安裝并加速GitHub

一、下載 官方地址:(Steam++官網) - Watt Toolkit Gitee下載地址:https://gitee.com/rmbgame/SteamTools/releases/tag/3.0.0-rc.16

DevOps運維與開發一體化及Kubernetes運維核心詳解

前言: 在云原生時代,技術的融合與流程的重構已成為驅動業務創新的核心引擎。Kubernetes作為容器編排的事實標準,其穩定的運維能力是業務應用的基石;而DevOps所倡導的開發與運維一體化文化,則是實現快速交付和價值流動的…

HQX SELinux 權限問題分析與解決

Google自Android 5.0起強制實施的SELinux安全子系統,通過最小權限原則顯著提升了系統安全性,但這也導致開發過程中頻繁出現權限拒絕問題。值得注意的是,即便設備已獲取root權限,SELinux的強制訪問控制機制仍會限制部分敏感操作。 …

SpringBoot集成Kafka實戰應用

目錄 使用Kafka-Client實現消息收發 引入依賴 發送端: 消費端: SpringBoot集成 引入maven依賴 消費端 在上一篇我們深度解析了Kafka的運行操作原理以及集群消息消費機制等,請點擊下方鏈接獲取 Kafka消息隊列深度解析與實戰指南 本篇我…

單元測試總結2

1、重載和重寫的區別01、定義不同:重載是在同一個類中定義多個方法名相同但參數列表不同的方法;重寫是子類對父類中同名同參數列表的方法進行重新實現02、范圍不同:重載發生在同一個類中,重寫發生在子類和父類中03、參數要求不同&…

Wi-Fi技術——MAC特性

有線和無線網絡在數據鏈路層的特性存在差異,具體為: CSMA/CD 用于有線網絡,通過檢測和處理沖突來維持網絡的穩定性。CSMA/CA 用于無線網絡,強調沖突的預防,以應對無線信道共享的挑戰 1 有線網 CSMA/CD 有線網 CSMA/…

OpenHarmony 分布式感知中樞深度拆解:MSDP 框架從 0 到 1 的實戰指南

MSDP設備狀態感知框架技術開發文檔 1. 系統概述 1.1 框架定位 MSDP (Multi-Sensor Data Processing) 設備狀態感知框架是OpenHarmony系統中負責設備狀態識別和分發的核心服務,基于多傳感器融合技術,為系統應用提供設備狀態感知能力。 1.2 核心功能 靜止狀態識別:基于加速…

圖像 OSD層數據 顯示--OSD LOGO單色黑色顯示,按區域大小申請MMZ內存的優缺點分析

在監控攝像機、嵌入式顯示設備等場景中,OSD(On-Screen Display,屏幕顯示)LOGO 常需單色黑色顯示,且按區域大小申請 MMZ(Multi-Media Zone,多媒體專用內存)內存,該方案的優缺點需結合硬件資源、顯示效率、功能適配性等維度綜合分析,具體如下: 一、核心優勢:針對性優…

徐真妍最新雜志封面大片曝光,探索鏡頭下的多面魅力

近日,青年演員徐真妍拍攝的一組大片正式曝光。這組以 “森林系” 為主題的大片,登上時尚雜志《慵懶LAZY DAYS》8-9月刊封面。融合了優雅與現代先鋒感,展現了徐真妍甜美溫婉的表現力。鏡頭前的她,在多種風格間自如切換,…

廣度優先搜索(BFS, Breadth-First Search)

好的,我給你講 廣度優先搜索(BFS, Breadth-First Search),并配一個直觀例子。1?? 什么是廣度優先廣度優先搜索的特點:按層訪問:先訪問根節點,然后訪問它的直接子節點,再訪問子節點…

GD32入門到實戰22--紅外NEC通信協議

ir_drv.c紅外傳輸協議地位在前&#xff0c;所以我們可以這樣保存數據到數組假使接收到1就>>1再|0x80&#xff0c;如果接收到0就>>1新建紅外驅動層代碼ir_drv.c#include <stdio.h> #include "gd32f30x.h" #include <stdbool.h> static voi…

zkML-JOLT——更快的ZK隱私機器學習:Sumcheck +Lookup

1. 引言 ICME團隊開源的zkML項目&#xff1a; https://github.com/ICME-Lab/jolt-atlas&#xff08;Rust&#xff09; zkML-JOLT&#xff08;JOLT ‘Atlas’&#xff09;構建在a16z Crypto團隊的JOLT研究和實現基礎上&#xff0c;其性能比其他zkML項目快了3到7倍。 a16z Cr…