【HarmonyOS】模仿个人中心头像图片,调用系统相机拍照,从系统相册选择图片和圆形裁剪显示 (一)

ops/2024/12/23 2:30:00/

【HarmonyOS】头像图片,调用系统相机拍照,从系统相册选择图片和圆形裁剪显示 (一)

Demo效果展示:

在这里插入图片描述

方案思路:

使用photoAccessHelper实现系统相册选择图片的功能。此API可在无需用户授权的情况下,通过系统的安全相册组件访问用户所有的相册内容。

使用startAbilityForResult实现跳转到系统相机,进行拍照后,返回当前应用的功能。需要注意的是want参数中callBundleName一定要为当前应用的包名,否则会导致返回过来的图片uri参数,没有操作权限。

使用Image的borderRadius展示圆形图片,进行裁剪展示。实际图片还是为矩形。

手势放大缩小,滑动图片进行圆形裁剪的效果,参见第二篇文章。

Demo示例代码:

import { common, Want } from '@kit.AbilityKit';
import { photoAccessHelper } from '@kit.MediaLibraryKit';
import { image } from '@kit.ImageKit';
import { fileIo as fs } from '@kit.CoreFileKit';

struct Index {private TAG: string = "imageTest"; pixel: image.PixelMap | undefined = undefined; photoSize: number = 0; isCrop: boolean = false;context: common.UIAbilityContext | undefined = (getContext(this) as common.UIAbilityContext);savePath: string = getContext().filesDir;private async thirdPartyCall(supportMultiMode: boolean) {this.isCrop = false;console.log("thirdPartyCall savaPath=" + this.savePath);// 拉起拍照功能let want: Want = {"action": 'ohos.want.action.imageCapture',"parameters": {supportMultiMode: supportMultiMode,// 回调包名很重要,若不匹配将无法获取返回图片Uri的操作权限callBundleName: "com.example.persontest"}};// 获取图片uriif (this.context) {let result: common.AbilityResult = await this.context.startAbilityForResult(want);let params = result?.want?.parameters as Record<string, string | number>let imagePathSrc = params?.resourceUri as string;console.info(this.TAG, 'thirdPartyCall imagePathSrc= ' + imagePathSrc);console.info(this.TAG, 'thirdPartyCall params= ' + JSON.stringify(params));await this.getImage(imagePathSrc);}}private async getPictureFromAlbum() {this.isCrop = false;// 拉起相册,选择图片let PhotoSelectOptions = new photoAccessHelper.PhotoSelectOptions();PhotoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE;PhotoSelectOptions.maxSelectNumber = 1;let photoPicker = new photoAccessHelper.PhotoViewPicker();let photoSelectResult: photoAccessHelper.PhotoSelectResult = await photoPicker.select(PhotoSelectOptions);let albumPath = photoSelectResult.photoUris[0];console.info(this.TAG, 'getPictureFromAlbum albumPath= ' + albumPath);await this.getImage(albumPath);}private async getImage(path: string) {console.info(this.TAG, 'getImage path: ' + path);try {// 读取图片为bufferconst file = fs.openSync(path, fs.OpenMode.READ_ONLY);this.photoSize = fs.statSync(file.fd).size;console.info(this.TAG, 'Photo Size: ' + this.photoSize);let buffer = new ArrayBuffer(this.photoSize);fs.readSync(file.fd, buffer);fs.closeSync(file);// 解码成PixelMapconst imageSource = image.createImageSource(buffer);console.log(this.TAG, 'imageSource: ' + JSON.stringify(imageSource));this.pixel = await imageSource.createPixelMap({});} catch (e) {console.info(this.TAG, 'getImage e: ' + JSON.stringify(e));}}private cropImage(){this.isCrop = true;// this.pixel?.crop({x: 0, y: 0, size: { height: 100, width: 100 } });}build() {Scroll(){Column() {Text("点击拍照").id('HelloWorld').fontSize(50).fontWeight(FontWeight.Bold).onClick(() => {this.thirdPartyCall(false);})Text("相册选择").id('HelloWorld').fontSize(50).fontWeight(FontWeight.Bold).onClick(() => {this.getPictureFromAlbum();})Image(this.pixel).width('100%').aspectRatio(1)Text("图片裁剪").id('HelloWorld').fontSize(50).fontWeight(FontWeight.Bold).onClick(() => {this.cropImage();})if(this.isCrop){Image(this.pixel).width('100%').aspectRatio(1).borderRadius(200)}}.height(3000).width('100%')}.height('100%').width('100%')}
}

http://www.ppmy.cn/ops/105089.html

相关文章

整数算术运算中的错误

如果一个整数被零除&#xff0c;将不会产生正确的结果&#xff0c;而是出现一个异常&#xff08; exception &#xff09;.在Java中&#xff0c;异常是标志错误的一种方法&#xff0c;我们将在第7章中详细地介绍。对变量或表达式应用%运算符&#xff0c;如果右侧的操作数是零&a…

【什么是电商供应链】

文章目录 前言一、商品来源与采购计划&#xff1a;二、商品信息与库存管理&#xff1a;三、订单处理与物流配送&#xff1a;四、金融服务与全球采购&#xff1a;总结 前言 电商供应链是将传统供应链电子商务化&#xff0c;通过互联网服务平台实现供应链交易过程的全程电子化&a…

AI人数智能统计监测摄像头

随着人工智能技术的不断发展&#xff0c;AI人数智能统计监测摄像头 在各个领域得到了广泛应用。这种摄像头结合了图像识别技术和智能算法&#xff0c;旨在实现对人群数量的准确统计和监测。通过高清晰度的摄像头捕捉到场景中的人群图像&#xff0c;并通过人工智能技术进行快速准…

环信高质量全球网络——70%丢包环境,消息100%送达,抗弱网能力大幅提升!

在当今数字化时代&#xff0c;稳定而高效的即时通讯已成为企业和个人不可或缺的工具。环信即时通讯&#xff08;IM&#xff09;云服务一直致力于为用户提供优质的通信体验。如今&#xff0c;环信IM通过自研传输协议&#xff0c;实现了在弱网环境下的卓越表现&#xff0c;确保消…

基于Spring的Uniapp自动更新实现方法

Uniapp自动更新 本文介绍了基于rouyi-uniapp的更新包版本自动推送更新。结合minio和网址下载地址两种方式&#xff0c;计算版本号大小后&#xff0c;可选是否强制更新。 一、表结构和后端版本号检测设计 1、版本更新控制表结构 主要字段和设计思路&#xff1a; fileUrl&…

微信小程序知识点(一)

1.条件判断&#xff1a; wx:if&#xff0c;wx:elif&#xff0c;wx:else 和Hidden的区别 wx:if等是动态实现组件的&#xff0c;符合条件&#xff0c;页面上就新增一个组件&#xff0c;不符合&#xff0c;就会在也页面上加载&#xff0c;而Hidden只是控制页面的组件的显示与否&…

停止在 AWS 中使用 SSH!原因如下!DevSecOps 视角

我们要解决什么问题&#xff1f;欢迎来到雲闪世界。 我见过多少次安全组从 10.0.0.0/8 或更糟的 0.0.0.0/0 开放端口 22&#xff1f;太多次了&#xff01;但为什么&#xff0c;为什么在有更好的替代方案的情况下&#xff0c;我们在 2024 年仍在使用 SSH&#xff1f;作为一名安全…

2024/9/3黑马头条跟学笔记(一)

D1 视频链接 Day1-05-nacos环境搭建_哔哩哔哩_bilibili 内容介绍 搭建微服务开发环境&#xff0c;登录接口包含注册中心和nacos配置中心 服务端用户…微服务。网关负载均衡转发接口请求 实现微服务间互相通信 接口测试 前后端联调 前置知识 背景介绍 类似今日头条&#x…