開源 Arkts 鴻蒙應用 開發(八)多媒體--相冊和相機

?文章的目的為了記錄使用Arkts?進行Harmony?app?開發學習的經歷。本職為嵌入式軟件開發,公司安排開發app,臨時學習,完成app的開發。開發流程和要點有些記憶模糊,趕緊記錄,防止忘記。

??相關鏈接:

開源 Arkts 鴻蒙應用 開發(一)工程文件分析-CSDN博客

開源 Arkts 鴻蒙應用 開發(二)封裝庫.har制作和應用-CSDN博客

開源 Arkts 鴻蒙應用 開發(三)Arkts的介紹-CSDN博客

開源 Arkts 鴻蒙應用 開發(四)布局和常用控件-CSDN博客

開源 Arkts 鴻蒙應用 開發(五)控件組成和復雜控件-CSDN博客

開源 Arkts 鴻蒙應用 開發(六)數據持久--文件和首選項存儲-CSDN博客

開源 Arkts 鴻蒙應用 開發(七)數據持久--sqlite關系數據庫-CSDN博客

開源 Arkts 鴻蒙應用 開發(八)多媒體--相冊和相機-CSDN博客

開源 Arkts 鴻蒙應用 開發(九)通訊--tcp客戶端-CSDN博客

開源 Arkts 鴻蒙應用 開發(十)通訊--Http數據傳輸-CSDN博客

?推薦鏈接:

開源 java android app 開發(一)開發環境的搭建-CSDN博客

開源 java android app 開發(二)工程文件結構-CSDN博客

開源 java android app 開發(三)GUI界面布局和常用組件-CSDN博客

開源 java android app 開發(四)GUI界面重要組件-CSDN博客

開源 java android app 開發(五)文件和數據庫存儲-CSDN博客

開源 java android app 開發(六)多媒體使用-CSDN博客

開源 java android app 開發(七)通訊之Tcp和Http-CSDN博客

開源 java android app 開發(八)通訊之Mqtt和Ble-CSDN博客

開源 java android app 開發(九)后臺之線程和服務-CSDN博客

開源 java android app 開發(十)廣播機制-CSDN博客

開源 java android app 開發(十一)調試、發布-CSDN博客

開源 java android app 開發(十二)封庫.aar-CSDN博客

推薦鏈接:

開源C# .net mvc 開發(一)WEB搭建_c#部署web程序-CSDN博客

開源 C# .net mvc 開發(二)網站快速搭建_c#網站開發-CSDN博客

開源 C# .net mvc 開發(三)WEB內外網訪問(VS發布、IIS配置網站、花生殼外網穿刺訪問)_c# mvc 域名下不可訪問內網,內網下可以訪問域名-CSDN博客

開源 C# .net mvc 開發(四)工程結構、頁面提交以及顯示_c#工程結構-CSDN博客

開源 C# .net mvc 開發(五)常用代碼快速開發_c# mvc開發-CSDN博客

本章內容主要是鴻蒙的多媒體使用,主要功能包括從相冊選擇圖片、拍攝照片以及將圖片保存到應用沙箱目錄。

1.使用流程

2.相冊和相機的使用

3.保存到沙箱

4.所有代碼

5.顯示效果

一、使用流程圖

二、相冊和相機的使用

2.1??使用PhotoViewPicker選擇圖片

         Button("打開相冊照片").width('100%').height(40).onClick(async () => {try {let PhotoSelectOptions = new photoAccessHelper.PhotoSelectOptions();PhotoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE;PhotoSelectOptions.maxSelectNumber = 1;let photoPicker = new photoAccessHelper.PhotoViewPicker();photoPicker.select(PhotoSelectOptions).then((PhotoSelectResult: photoAccessHelper.PhotoSelectResult) => {this.imageUri = PhotoSelectResult.photoUris[0] ? PhotoSelectResult.photoUris[0] : this.imageUri;hilog.info(0x0000, TAG, 'PhotoViewPicker.select succeed, uri: ' + JSON.stringify(PhotoSelectResult));}).catch((err: BusinessError) => {hilog.error(0x0000, TAG, `PhotoViewPicker.select failed, error: ${err.code}, ${err.message}`);});} catch (error) {let err: BusinessError = error as BusinessError;hilog.error(0x0000, TAG, `PhotoViewPicker failed, error: ${err.code}, ${err.message}`);}this.isShowGet = false;})

2.2??用cameraPicker調用設備相機

          Button("相機拍攝照片").width('100%').height(40).onClick(async () => {// [Start pick_file]try {let pickerProfile: cameraPicker.PickerProfile ={ cameraPosition: camera.CameraPosition.CAMERA_POSITION_BACK };//Select the action of pulling up the camera to take pictures.let pickerResult: cameraPicker.PickerResult = await cameraPicker.pick(this.getUIContext().getHostContext(),[cameraPicker.PickerMediaType.PHOTO], pickerProfile);//Return the photo uri to the application.this.imageUri = pickerResult.resultUri ? pickerResult.resultUri : this.imageUri;hilog.info(0x0000, TAG, 'cameraPicker.pick succeed, uri: ' + JSON.stringify(pickerResult));} catch (error) {let err = error as BusinessError;hilog.error(0x0000, TAG, `cameraPicker.pick failed, error: ${err.code}, ${err.message}`);}// [End pick_file]this.isShowGet = false;})

三、保存到沙箱,特別的是大量使用async/await處理異步操作

 async saveImageToSandbox() {// 1. 檢查圖片URIif (!this.imageUri) {this.getUIContext().getPromptAction().showToast({message: $r('app.string.no_image_alert'),duration: 2000});return;}try {// 2. 等待圖片復制到沙箱await copyImg2Sandbox(this.imageUri, this.path);// 3. 創建ImageSourcethis.imageSource = image.createImageSource(this.path);// 4. 并行獲取圖片信息await Promise.all([new Promise<void>((resolve, reject) => {this.imageSource!.getImageInfo((error, info) => {error ? reject(error) : resolve();});}),this.imageSource.getImageProperties([image.PropertyKey.IMAGE_WIDTH,image.PropertyKey.IMAGE_LENGTH,image.PropertyKey.F_NUMBER])]);// 5. 創建PixelMap(確保這一步成功)this.pixelMap = await this.imageSource.createPixelMap();if (!this.pixelMap) {throw new Error('Failed to create PixelMap');}// 6. 保存到文件await pixelMap2File(this.pixelMap, this.path);this.getUIContext().getPromptAction().showToast({message: $r('app.string.save_in_sandbox_success'),duration: 2000});this.isShowSave = false;} catch (error) {this.handleSaveError(error as BusinessError);}}

四、所有代碼,新建工程后,只修改Index.ets就可以

Index.ets代碼

import { image } from '@kit.ImageKit';
import { PhotoPickerComponent, PickerController, photoAccessHelper, ReminderMode } from '@kit.MediaLibraryKit';
import { cameraPicker, camera } from '@kit.CameraKit';
import { picker } from '@kit.CoreFileKit';
import { promptAction } from '@kit.ArkUI';
import { BusinessError } from '@kit.BasicServicesKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { copyImg2Sandbox, pixelMap2File } from '../common/utils/Utils';const TAG = 'IMAGE_APP';@Entry
@Component
struct Index {@State path: string = this.getUIContext().getHostContext()!.filesDir + '/image.jpg';@State pixelMapPath: string = this.getUIContext().getHostContext()!.filesDir + '/pixelMap.jpg';@State imageUri: string | undefined = undefined;@State imageSource: image.ImageSource | undefined = undefined;@State pixelMap: image.PixelMap | undefined = undefined;@State isShowGet: boolean = false;@State isShowPicker: boolean = false;@State isShowSave: boolean = false;@State pickerController: PickerController = new PickerController();async saveImageToSandbox() {// 1. 檢查圖片URIif (!this.imageUri) {this.getUIContext().getPromptAction().showToast({message: $r('app.string.no_image_alert'),duration: 2000});return;}try {// 2. 等待圖片復制到沙箱await copyImg2Sandbox(this.imageUri, this.path);// 3. 創建ImageSourcethis.imageSource = image.createImageSource(this.path);// 4. 并行獲取圖片信息await Promise.all([new Promise<void>((resolve, reject) => {this.imageSource!.getImageInfo((error, info) => {error ? reject(error) : resolve();});}),this.imageSource.getImageProperties([image.PropertyKey.IMAGE_WIDTH,image.PropertyKey.IMAGE_LENGTH,image.PropertyKey.F_NUMBER])]);// 5. 創建PixelMap(確保這一步成功)this.pixelMap = await this.imageSource.createPixelMap();if (!this.pixelMap) {throw new Error('Failed to create PixelMap');}// 6. 保存到文件await pixelMap2File(this.pixelMap, this.path);this.getUIContext().getPromptAction().showToast({message: $r('app.string.save_in_sandbox_success'),duration: 2000});this.isShowSave = false;} catch (error) {this.handleSaveError(error as BusinessError);}}// 錯誤處理方法private handleSaveError(error: BusinessError) {hilog.error(0x0000, TAG, `保存失敗: ${error.code}, ${error.message}`);let message = "save_failed";if (error.message.includes('createPixelMap')) {message = "pixelmap_creation_failed";} else if (error.message.includes('copyImg2Sandbox')) {message = "copy_failed";}this.getUIContext().getPromptAction().showToast({message,duration: 2000});}build() {Navigation() {Column() {Image(this.imageUri).height(400).margin({ top: 16 })Column({ space: 12 }) {Button("打開相冊照片").width('100%').height(40).onClick(async () => {try {let PhotoSelectOptions = new photoAccessHelper.PhotoSelectOptions();PhotoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE;PhotoSelectOptions.maxSelectNumber = 1;let photoPicker = new photoAccessHelper.PhotoViewPicker();photoPicker.select(PhotoSelectOptions).then((PhotoSelectResult: photoAccessHelper.PhotoSelectResult) => {this.imageUri = PhotoSelectResult.photoUris[0] ? PhotoSelectResult.photoUris[0] : this.imageUri;hilog.info(0x0000, TAG, 'PhotoViewPicker.select succeed, uri: ' + JSON.stringify(PhotoSelectResult));}).catch((err: BusinessError) => {hilog.error(0x0000, TAG, `PhotoViewPicker.select failed, error: ${err.code}, ${err.message}`);});} catch (error) {let err: BusinessError = error as BusinessError;hilog.error(0x0000, TAG, `PhotoViewPicker failed, error: ${err.code}, ${err.message}`);}this.isShowGet = false;})Button("相機拍攝照片").width('100%').height(40).onClick(async () => {// [Start pick_file]try {let pickerProfile: cameraPicker.PickerProfile ={ cameraPosition: camera.CameraPosition.CAMERA_POSITION_BACK };//Select the action of pulling up the camera to take pictures.let pickerResult: cameraPicker.PickerResult = await cameraPicker.pick(this.getUIContext().getHostContext(),[cameraPicker.PickerMediaType.PHOTO], pickerProfile);//Return the photo uri to the application.this.imageUri = pickerResult.resultUri ? pickerResult.resultUri : this.imageUri;hilog.info(0x0000, TAG, 'cameraPicker.pick succeed, uri: ' + JSON.stringify(pickerResult));} catch (error) {let err = error as BusinessError;hilog.error(0x0000, TAG, `cameraPicker.pick failed, error: ${err.code}, ${err.message}`);}// [End pick_file]this.isShowGet = false;})Button("保存照片到APP目錄").width('100%').height(40).onClick(async () => {this.saveImageToSandbox();})}.width('100%').height(150).padding({ left: 16, right: 16 }).margin({ bottom: 16 }).justifyContent(FlexAlign.SpaceBetween)}.width('100%').height('100%').justifyContent(FlexAlign.SpaceBetween)}.width('100%').height('100%').title($r('app.string.title'))}
}

五、顯示效果

5.1? app圖片和打開相冊后圖片

5.2? 保存到APP目錄后圖片所存位置圖,點擊DevEco的右下角的 Device File Browser

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

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

相關文章

無線通信資源分配相關算法

1.Maximum Clique First (MCF)是一種啟發式圖著色算法&#xff08;heuristic graph coloring algorithm&#xff09;&#xff0c;它的核心思想是&#xff1a;優先為圖中最大團&#xff08;maximum clique&#xff09;中的頂點分配不同的顏色&#xff0c;然后再依次為其他頂點上…

Kafka監控體系搭建:基于Prometheus+JMX+Grafana的全方位性能觀測方案

為什么需要Kafka監控監控架構概述步驟一&#xff1a;部署JMX Exporter 1.1 下載JMX Agent1.2 創建指標暴露配置 步驟二&#xff1a;配置Kafka集成JMX 2.1 啟動參數配置2.2 驗證指標暴露 步驟三&#xff1a;配置Prometheus采集 3.1 修改Prometheus配置3.2 驗證數據采集 步驟四&a…

stack 和 queue

目錄 一、stack 1.1 stack 的介紹 1.2 stack的使用 1&#xff09;最小棧 2&#xff09;棧的彈出壓入序列 3&#xff09;逆波蘭表達式求值 1.3 stack 的模擬使用 二、queue 2.1 queue的介紹 2.2 queue的使用 2.3 queue的模擬使用 三、容器適配器 3.1 什么是容器適配…

sqlsuger 子表獲取主表中的一個字段的寫法

在使用 SQL 語言進行數據庫操作時&#xff0c;如果你想要從子表獲取數據&#xff0c;同時關聯到主表中的一個字段&#xff0c;通常我們會使用 SQL 的 JOIN 語句。JOIN 語句允許你通過一個或多個共同的字段將兩個或多個表連接起來。這里我將展示幾種常見的 JOIN 類型&#xff08…

Docker配置Gitlab-runner實現自動化容器化部署前端項目

疊甲前言 本文僅作為個人學習GitLab的CI/CD功能記錄&#xff0c;不適合作為專業性指導&#xff0c;如有紕漏&#xff0c;煩請君指正。 云主機注冊Gitlab Runner 自動化構建部署的弊端 在前一文中&#xff0c;我們在Linux云主機上注冊了Gitlab-runner, 每次在gitlab流水線上發…

MySQL介紹和MySQL包安裝

文章目錄MySQL介紹和安裝1.MySQL介紹1.1 MySQL 的定義1.2 MySQL 的特點1.3 MySQL 的應用領域1.4 MySQL 的存儲引擎1.5 MySQL 的架構1.6 MySQL 的優勢和局限性1.7 MySQL 的未來發展趨勢2.MySQL安裝2.1 主機初始化2.1.1 設置網卡名2.1.2 設置ip地址2.1.3 配置鏡像源2.1.4 關閉防火…

J2EE模式---視圖助手模式

視圖助手模式基礎概念視圖助手模式&#xff08;View Helper Pattern&#xff09;是一種結構型設計模式&#xff0c;其核心思想是將視圖層中復雜的邏輯提取到獨立的助手類中&#xff0c;使視圖代碼更加簡潔、易于維護。視圖助手通常提供一系列工具方法&#xff0c;用于處理格式化…

開源的語音合成大模型-Cosyvoice使用介紹

1 模型概覽 CosyVoice 是由阿里巴巴達摩院通義實驗室開發的新一代生成式語音合成大模型系列&#xff0c;其核心目標是通過大模型技術深度融合文本理解與語音生成&#xff0c;實現高度擬人化的語音合成體驗。該系列包含初代 CosyVoice 及其升級版 CosyVoice 2.0&#xff0c;兩者…

深度學習·CLIP

CLIP 數據大小 4億個文本-圖像對&#xff0c;而且是高質量的 預訓練方法 Text encoder“The text sequence is bracketed with [SOS] and [EOS] tokens and the activations of the highest layer of the transformer at the [EOS] token are used as the feature representati…

美光MTFC8GAKAJCN-4M_IT型eMMC應用介紹

1.1 芯片訂購信息美光MTFC8GAKAJCN-4M_IT型eMMC&#xff0c;容量8GB&#xff0c;153-ball VFBGA封裝。1.2 eMMC料號含義2.1 特性?多媒體卡&#xff08;MMC&#xff09;控制器和NAND閃存?153球FBGA封裝&#xff08;符合RoHS標準&#xff0c;環保封裝&#xff09;?VCC&#xf…

面向對象分析與設計40講(6)設計原則之開閉原則

文章目錄 一、概念 二、示例(C++ 實現) 1. 違反開閉原則的示例 2. 遵循開閉原則的示例 一、概念 開閉原則(Open-Closed Principle,OCP)是面向對象設計中的重要原則,由 Bertrand Meyer 提出,核心思想可以概括為:對擴展開放,對修改關閉。 具體來說,一個軟件實體(如類…

[Linux入門] Linux 網絡設置入門:從查看、測試到配置全攻略

目錄 一、查看網絡信息&#xff1a;了解你的網絡狀態 1??核心工具&#xff1a;ip命令&#xff08;替代ifconfig&#xff09; <1> 基本語法&#xff1a; <2> 實用操作示例&#xff1a; 2??查看路由表&#xff1a;route命令 3??查看網絡連接狀態&#xf…

TyFlow:三維領域的粒子特效革命者

在動態模擬與視覺特效領域&#xff0c;??TyFlow?? 作為 3ds Max 中誕生的一款革命性粒子系統插件&#xff08;后來也支持獨立開發&#xff09;&#xff0c;正在徹底改變藝術家們創作復雜動力學效果的方式。它以其無與倫比的靈活性、強大的計算能力和開創性的技術理念&#…

本地一鍵部署 Spark-TTS,支持Mac和Windows

Spark-TTS是一個文本轉語音(TTS)的項目&#xff0c;零樣本語音克隆逼真&#xff0c;多語言支持&#xff0c;語音參數可控。使用魔當(LM Downloader)&#xff0c;可以實現Spark-TTS的本地一鍵部署。 注意 如果使用Windows&#xff0c;推薦用NVIDIA顯卡&#xff0c;生成速度較快…

傳統時間:Date日期類,SimpleDateFormat,Calendar

目錄DateSimpleDateFormatCalendarDate 代表的是日期和時間 常見構造器和方法&#xff1a; 構造器說明public Date()創建一個Date對象&#xff0c;代表的是系統當前此刻日期時間public Date(long time)把時間毫秒值轉換成Date日期對象 常見方法說明public long getTime()返…

linus 環境 tomcat啟動日志分隔

1.定義可執行文件&#xff1a;tomcatlog9090.sh fsize$(ls -l /data/tomcat-cms_9090/logs/catalina.out | cut -d -f 5)if [ $fsize -gt 40960000 ]; thenextdatedate %Y_%m_%d_%k_%Mdatapath/data/tomcat-cms_9090/logscd /data/tomcat-cms_9090/logscp catalina.out catali…

解密 Base64 編碼:從原理到應用的全面解析

在網絡傳輸、數據存儲的世界里&#xff0c;Base64 編碼如同一座隱形的橋梁&#xff0c;默默承擔著重要的角色。當你發送郵件附件、在網頁中嵌入圖片&#xff0c;或是處理一些特殊格式的數據時&#xff0c;都可能在不知不覺中與它打交道。那么&#xff0c;Base64 編碼究竟是什么…

C++實現Adam與RMSProp優化算法

C++中實現Adam和RMSProp優化算法 以下是一些關于C++中實現Adam和RMSProp優化算法的實用示例和資源,涵蓋不同場景和應用。由于篇幅限制,完整代碼,但提供關鍵實現片段、庫使用方法和學習資源。 基礎Adam優化器實現 Adam優化器實現 #include <vector> #include <c…

【物聯網】基于樹莓派的物聯網開發【16】——樹莓派GPIO控制LED燈實驗

場景介紹 掌握GPIO引腳連接雙色LED模塊&#xff0c;編寫Python程序代碼&#xff0c;實現GPIO控制點亮雙色LED燈&#xff01; 窗口查看引腳編號 1、在終端輸入指令&#xff1a;pinout2、使用樹莓派輸入gpio readall命令查看pin狀態 輸入以下命令安裝Git sudo apt install git-co…

低延遲網絡中 gRPC 客戶端的隱藏瓶頸及解決方案

低延遲網絡中 gRPC 客戶端的隱藏瓶頸及解決方案 在分布式系統性能優化領域,有一句名言:"優化非瓶頸環節都是徒勞"(Eliyahu M. Goldratt)。gRPC 作為廣泛使用的高性能服務間通信框架,在特定場景下也會出現容易被忽略的客戶端瓶頸。本文將解析這一問題的本質、復現…