OpenHarmony Camera開發指導(五):相機預覽功能(ArkTS)

預覽是在相機啟動后實時顯示場景畫面,通常在拍照和錄像前執行。

開發步驟

創建預覽Surface

如果想在屏幕上顯示預覽畫面,一般由XComponent組件為預覽流提供Surface(通過XComponent的getXcomponentSurfaceId方法獲取surfaceid),而XComponent的能力由UI提供,相關介紹可參考XComponent組件。

// xxx.ets
// 創建XComponentController 
@Component
struct XComponentPage {// 創建XComponentControllermXComponentController: XComponentController = new XComponentController;surfaceId: string = '';build() {Flex() {// 創建XComponentXComponent({id: '',type: 'surface',libraryname: '',controller: this.mXComponentController}).onLoad(() => {// 設置Surface寬高(以1920*1080為例)this.mXComponentController.setXComponentSurfaceSize({surfaceWidth:1920,surfaceHeight:1080});// 獲取Surface idthis.surfaceId = this.mXComponentController.getXComponentSurfaceId();}).width('1920px').height('1080px')}}
}

創建預覽輸出流

通過getSupportedOutputCapability方法獲取到的CameraOutputCapability類中的previewProfiles屬性表示當前設備支持的預覽配置信息集合,設備能夠支持多種不同的預覽能力。通過createPreviewOutput方法創建預覽輸出流,其中,createPreviewOutput方法中的兩個參數分別是previewProfilesArray數組中的某一項和上一步獲取的surfaceId。

import { camera } from '@kit.CameraKit';
import { BusinessError } from '@kit.BasicServicesKit';function getPreviewOutput(cameraManager: camera.CameraManager, cameraOutputCapability: camera.CameraOutputCapability, surfaceId: string): camera.PreviewOutput | undefined {let previewProfilesArray: Array<camera.Profile> = cameraOutputCapability.previewProfiles;let previewOutput: camera.PreviewOutput | undefined = undefined;try {// 可根據用戶需求選擇不同的previewProfilepreviewOutput = cameraManager.createPreviewOutput(previewProfilesArray[0], surfaceId);} catch (error) {let err = error as BusinessError;console.error("Failed to create the PreviewOutput instance. error code: " + err.code);}return previewOutput;
}

啟動預覽

通過Session.start方法開始輸出預覽流。

async function startPreviewOutput(cameraManager: camera.CameraManager, previewOutput: camera.PreviewOutput): Promise<void> {let cameraArray: Array<camera.CameraDevice> = [];cameraArray = cameraManager.getSupportedCameras();if (cameraArray.length == 0) {console.error('no camera.');return;}// 獲取支持的模式類型。let sceneModes: Array<camera.SceneMode> = cameraManager.getSupportedSceneModes(cameraArray[0]);let isSupportPhotoMode: boolean = sceneModes.indexOf(camera.SceneMode.NORMAL_PHOTO) >= 0;if (!isSupportPhotoMode) {console.error('photo mode not support');return;}let cameraInput: camera.CameraInput | undefined = undefined;cameraInput = cameraManager.createCameraInput(cameraArray[0]);if (cameraInput === undefined) {console.error('cameraInput is undefined');return;}// 打開相機。await cameraInput.open();let session: camera.PhotoSession = cameraManager.createSession(camera.SceneMode.NORMAL_PHOTO) as camera.PhotoSession;session.beginConfig();session.addInput(cameraInput);session.addOutput(previewOutput);await session.commitConfig();await session.start();
}

注:4.0版本需通過調用PreviewOutput.start方法開始輸出預覽流,從4.1版本開始廢棄該方法,改用session.start啟動會話同時輸出預覽流。

停止預覽

通過Session.stop方法停止輸出預覽流。4.0版本需通過調用PreviewOutput.stop方法停止輸出預覽流,從4.1版本開始廢棄該方法,改用session.stop停止會話同時停止輸出預覽流。

function stopCaptureSession(session: camera.Session): void {session.stop((err: BusinessError) => {if (err) {console.error(`Failed to stop the session, error code: ${err.code}.`);return;}console.info('Callback invoked to indicate the session stop success.');});

狀態監聽

在相機應用開發過程中,可以隨時監聽預覽輸出流的狀態,包括預覽流啟動、預覽流結束、預覽流輸出錯誤信息。

通過注冊"frameStart"回調函數獲取監聽預覽啟動結果,previewOutput創建成功時即可監聽,底層第一次開始曝光時觸發該事件并返回,有該事件返回結果則認為預覽流已啟動。

function callback(err: BusinessError): void {if (err !== undefined && err.code !== 0) {console.error(`Callback Error, errorCode: ${err.code}`);return;}console.info('Preview frame started');
}function registerPreviewOutputFrameStart(previewOutput: camera.PreviewOutput): void {previewOutput.on('frameStart', callback);
}

通過注冊的"frameEnd"回調函數獲取監聽預覽結束結果,previewOutput創建成功時即可監聽,預覽完全結束最后一幀時觸發該事件并返回,有該事件返回結果則認為預覽流已結束。

function callback(err: BusinessError): void {if (err !== undefined && err.code !== 0) {console.error(`Callback Error, errorCode: ${err.code}`);return;}console.info('Preview frame ended');
}function registerPreviewOutputFrameEnd(previewOutput: camera.PreviewOutput): void {previewOutput.on('frameEnd', callback);
}

通過注冊"error"回調函數獲取監聽預覽輸出的錯誤事件。

function onPreviewOutputError(previewOutput: camera.PreviewOutput): void {previewOutput.on('error', (previewOutputError: BusinessError) => {console.error(`Preview output error code: ${previewOutputError.code}`);});
}

預覽流配置信息

支持查詢預覽流支持的幀率范圍、預覽旋轉角度等信息;支持配置預覽流幀率范圍、預覽旋轉角度等。

function setFrameRateRange(previewOutput: camera.PreviewOutput): void {let supportedFrameRatesArray: Array<camera.FrameRateRange> = previewOutput.getSupportedFrameRates();previewOutput.setFrameRate(supportedFrameRatesArray[0].min, supportedFrameRatesArray[0].max);let activeFrameRate: camera.FrameRateRange = previewOutput.getActiveFrameRate();
}function setPreviewRotation(previewOutput: camera.PreviewOutput, previewRotation : camera.ImageRotation, isDisplayLocked: boolean): void {previewOutput.setPreviewRotation(previewRotation, isDisplayLocked);
}

API參考

createPreviewOutput

createPreviewOutput(profile: Profile, surfaceId: string): PreviewOutput

創建預覽輸出對象,同步返回結果。

createPreviewOutput(surfaceId: string): PreviewOutput

創建無配置信息的預覽輸出對象,同步返回結果。該接口需配合Session.preconfig方法一起使用。

PreviewOutput

預覽輸出類。繼承CameraOutput。

on(type: 'frameStart', callback: AsyncCallback<void>): void
off(type: 'frameStart', callback?: AsyncCallback<void>): void
on(type: 'frameEnd', callback: AsyncCallback<void>): void
off('frameEnd')
on('error')
off(type: 'error', callback?: ErrorCallback): void// 查詢支持的幀率范圍
getSupportedFrameRates(): Array<FrameRateRange>// 設置預覽流幀率范圍,設置的范圍必須在支持的幀率范圍內。 進行設置前,可通過getSupportedFrameRates查詢支持的幀率范圍
setFrameRate(minFps: number, maxFps: number): void// 獲取已設置的幀率范圍,使用setFrameRate對預覽流設置過幀率后可查詢。
getActiveFrameRate(): FrameRateRange// 獲取當前生效的配置信息
getActiveProfile(): Profile// 獲取預覽旋轉角度
getPreviewRotation(displayRotation: number): ImageRotation// 設置預覽旋轉角度
setPreviewRotation(previewRotation: ImageRotation, isDisplayLocked?: boolean): void

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

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

相關文章

puzzle(0531)腦力航跡

目錄 腦力航跡 規則 解法 簡單模式 中等模式 困難模式 專家模式 腦力航跡 規則 2條航跡會產生一個相對航跡&#xff1a; 根據相對航跡和其中一個航跡推導另外一個航跡。 解法 沒有任何需要推理的地方&#xff0c;就是純粹的2個矢量相加。 簡單模式 中等模式 困難模…

在win上安裝Ubuntu安裝Anaconda(linx環境)

一&#xff0c;安裝Ubuntu 1. 在 Microsoft 商城去下載Ubuntu(LTS:是長期維護的版本) 2.安裝完之后啟動程序&#xff0c;再重新打開一個黑窗口&#xff1a; wsl --list --verbose 3.關閉Ubuntu wsl --shutdown Ubuntu-22.04 WSL2 Ubuntu-20.04文件太占c盤空間&#xff0c;…

NEAT 算法解決 Lunar Lander 問題:從理論到實踐

NEAT 算法解決 Lunar Lander 問題:從理論到實踐 0. 前言1. 定義環境2. 配置 NEAT3. 解決 Lunar lander 問題小結系列鏈接0. 前言 在使用 NEAT 解決強化學習問題一節所用的方法只適用于較簡單的強化學習 (reinforcement learning, RL) 環境。在更復雜的環境中使用同樣的進化解…

【KWDB 創作者計劃】_上位機知識篇---ESP32-S3Arduino

文章目錄 前言1. ESP32-S3核心特性2. 開發環境搭建(1) 安裝Arduino IDE(2) 添加ESP32-S3支持(3) 選擇開發板(4) 關鍵配置3. 基礎代碼示例(1) 串口通信(USB/硬件串口)(2) Wi-Fi連接(3) 藍牙LE廣播4. 高級功能開發(1) USB OTG功能(2) AI加速(MicroTensorFlow)(3) 雙核任務處理…

JavaScript學習教程,從入門到精通,DOM節點操作語法知識點及案例詳解(21)

DOM節點操作語法知識點及案例詳解 一、語法知識點 1. 獲取節點 // 通過ID獲取 const element document.getElementById(idName);// 通過類名獲取&#xff08;返回HTMLCollection&#xff09; const elements document.getElementsByClassName(className);// 通過標簽名獲取…

PCA 降維實戰:從原理到電信客戶流失數據應用

一、簡介 在機器學習領域&#xff0c;數據的特征維度往往較高&#xff0c;這不僅會增加計算的復雜度&#xff0c;還可能導致過擬合等問題。主成分分析&#xff08;Principal Component Analysis&#xff0c;簡稱 PCA&#xff09;作為一種經典的降維技術&#xff0c;能夠在保留數…

信創時代編程開發語言選擇指南:國產替代背景下的技術路徑與實踐建議

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家、CSDN平臺優質創作者&#xff0c;高級開發工程師&#xff0c;數學專業&#xff0c;10年以上C/C, C#, Java等多種編程語言開發經驗&#xff0c;擁有高級工程師證書&#xff1b;擅長C/C、C#等開發語言&#xff0c;熟悉Java常用開…

Arcgis10.1的漢化包及破解文件分享

Arcgis10.1的漢化包分享 網上有好多10.2的漢化包&#xff0c;但是10.1的漢化包很少&#xff0c;特在此分析出來給大家 Arcgis10.1破解文件及漢化包: (訪問密碼: 9784) license manager破解安裝文件 另外也分享了license manager破解安裝文件&#xff0c;也在相同的分享鏈接里…

CrewAI Community Version(一)——初步了解以及QuickStart樣例

目錄 1. CrewAI簡介1.1 CrewAI Crews1.2 CrewAI Flows1.3 Crews和Flows的使用情景 2. CrewAI安裝2.1 安裝uv2.2 安裝CrewAI CLI 3. 官網QuickStart樣例3.1 創建CrewAI Crews項目3.2 項目結構3.3 .env3.4 智能體角色及其任務3.4.1 agents.yaml3.4.2 tasks.yaml 3.5 crew.py3.6 m…

word選中所有的表格——宏

Sub 選中所有表格()Dim aTable As TableApplication.ScreenUpdating FalseActiveDocument.DeleteAllEditableRanges wdEditorEveryoneFor Each aTable In ActiveDocument.TablesaTable.Range.Editors.Add wdEditorEveryoneNextActiveDocument.SelectAllEditableRanges wdEdito…

Tkinter與ttk模塊對比:構建現代 Python GUI 的進化之路

在 Python GUI 開發中&#xff0c;標準庫 tkinter 及其子模塊 ttk&#xff08;Themed Tkinter&#xff09;常被同時使用。本文通過功能對比和實際案例&#xff0c;簡單介紹這兩個模塊的核心差異。 1. 區別 Tkinter&#xff1a;Python 標準 GUI 工具包&#xff08;1994年集成&…

Linux系統之部署Dillinger個人文本編輯器

Linux系統之部署Dillinger個人文本編輯器 一、Dillinger介紹1.1 Dillinger簡介1.2 Dillinger特點1.3 使用場景二、本地環境介紹2.1 本地環境規劃2.2 本次實踐介紹三、檢查本地環境3.1 檢查本地操作系統版本3.2 檢查系統內核版本四、部署Node.js 環境4.1 下載Node.js安裝包4.2 解…

從malloc到free:動態內存管理全解析

1.為什么要有動態內存管理 我們已經掌握的內存開辟方法有&#xff1a; int main() {int val 20;//在棧空間上開辟四個字節char arr[20] { 0 };//在棧空間上開辟10個字節的連續空間return 0; }上述開辟的內存空間有兩個特點&#xff1a; 1.空間開辟的時候大小已經固定 2.數組…

健身房管理系統設計與實現(springboot+ssm+vue+mysql)含萬字詳細文檔

健身房管理系統設計與實現(springbootssmvuemysql)含萬字詳細文檔 健身房管理系統是一個全面的解決方案&#xff0c;旨在幫助健身房高效管理日常運營。系統主要功能模塊包括個人中心、會員管理、員工管理、會員卡管理、會員卡類型管理、教練信息管理、解聘管理、健身項目管理、…

seate TCC模式案例

場景描述 用戶下單時&#xff0c;需要創建訂單并從用戶賬戶中扣除相應的余額。如果訂單創建成功但余額劃扣失敗&#xff0c;則需要回滾訂單創建操作。使用 Seata 的 TCC 模式來保證分布式事務的一致性。 1. 項目結構 假設我們有兩個微服務&#xff1a; Order Service&#x…

【Linux】Rhcsa復習5

一、Linux文件系統權限 1、文件的一般權限 文件權限針對三類對象進行定義&#xff1a; owner 屬主&#xff0c;縮寫u group 屬組&#xff0c; 縮寫g other 其他&#xff0c;縮寫o 每個文件針對每類訪問者定義了三種主要權限&#xff1a; r&#xff1a;read 讀 w&…

《Operating System Concepts》閱讀筆記:p748-p748

《Operating System Concepts》學習第 64 天&#xff0c;p748-p748 總結&#xff0c;總計 1 頁。 一、技術總結 1.Transmission Control Protocol(TCP) 重點是要自己能畫出其過程&#xff0c;這里就不贅述了。 二、英語總結(生詞&#xff1a;3) transfer, transport, tran…

C語言之圖像文件的屬性

&#x1f31f; 嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 總有人間一兩風&#xff0c;填我十萬八千夢。 &#x1f680; 路漫漫其修遠兮&#xff0c;吾將上下而求索。 圖像文件屬性提取系統設計與實現 目錄 設計題目設計內容系統分析總體設計詳細設計程序實現…

opencv--基礎

opencv OpenCV是一個實現數字圖像處理和計算機視覺通用算法的開源跨平臺庫。 鏈接 opencv中的cv是什么意思 在OpenCV中&#xff0c;"cv" 是 "Computer Vision"&#xff08;計算機視覺&#xff09; 的縮寫。 opencv的實現語言 opencv的底層實現代碼是使…

Java創建對象的方式

1、通過new關鍵字創建新對象 用new關鍵字創建對象是我們在開發中最常用的方式&#xff0c;new關鍵字會為我們在堆內存中開辟一塊空間以存放對象的引用&#xff08;包含對象本身以及內部屬性的引用&#xff09;。 2、通過newInstance()方法創建新對象 newInstance()方法本質上是…