HarmonyOS NEXT开发实战教程:选择相册和拍照

今天的内容是介绍在鸿蒙开发中从相册选择照片,和调用相机拍照,并使用这两个功能实现朋友圈编辑页面。

图片

这部分内容没什么好废话的,都是固定用法,直接上代码。

首先添加权限:

ohos.permission.CAMERA


ohos.permission.READ_IMAGEVIDEO

选择相册:​

async  getAlbum() {
    const photoSelectOptions = new photoAccessHelper.PhotoSelectOptions();
    photoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE; // 过滤选择媒体文件类型为IMAGE
    photoSelectOptions.maxSelectNumber = 5; // 选择媒体文件的最大数目
    let uris: Array<string> = [];
    const photoViewPicker = new photoAccessHelper.PhotoViewPicker();
    photoViewPicker.select(photoSelectOptions).then((photoSelectResult: photoAccessHelper.PhotoSelectResult) => {
      uris = photoSelectResult.photoUris;
      uris.forEach(element => {
        this.photoList.push(element)
      });
      console.info('photoViewPicker.select to file succeed and uris are:' + uris);
    }).catch((err: BusinessError) => {
      console.error(`Invoke photoViewPicker.select failed, code is ${err.code}, message is ${err.message}`);
    })
  }

调用相机:​

async invokeCamera(callback: (uri: string) => void) {
    try {
      let pickerProfile: cameraPicker.PickerProfile = {
        cameraPosition: camera.CameraPosition.CAMERA_POSITION_BACK
      };
      let pickerResult: cameraPicker.PickerResult = await cameraPicker.pick(getContext(),
        [cameraPicker.PickerMediaType.PHOTO, cameraPicker.PickerMediaType.VIDEO], pickerProfile);
      console.log("the pick pickerResult is:" + JSON.stringify(pickerResult));
      if (callback && pickerResult) {
        callback(pickerResult.resultUri);
      }
    } catch (error) {
      let err = error as BusinessError;
      console.error(`the pick call failed. error code: ${err.code}`);
    }
  }

整个页面完整代码如下:​

import { photoAccessHelper } from '@kit.MediaLibraryKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { cameraPicker } from '@kit.CameraKit';
import { camera } from '@kit.CameraKit';
import { AlertSheet } from './AlertSheet';


@Entry
@Component
struct Index {


  @State photoList:string[] = []


  dialogController: CustomDialogController | null = new CustomDialogController({
    builder: AlertSheet({titles:['拍照','相册'],itemClick:(str)=>{
      switch (str){
        case '拍照':
          this.invokeCamera((url)=>{
            this.photoList.push(url)
          })
          break;
        case '相册':
          this.getAlbum()
          break;


      }
    }}),
    alignment: DialogAlignment.Bottom,
    offset: { dx: 0, dy: -25 }
  })


  async  getAlbum() {
    const photoSelectOptions = new photoAccessHelper.PhotoSelectOptions();
    photoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE; // 过滤选择媒体文件类型为IMAGE
    photoSelectOptions.maxSelectNumber = 5; // 选择媒体文件的最大数目
    let uris: Array<string> = [];
    const photoViewPicker = new photoAccessHelper.PhotoViewPicker();
    photoViewPicker.select(photoSelectOptions).then((photoSelectResult: photoAccessHelper.PhotoSelectResult) => {
      uris = photoSelectResult.photoUris;
      uris.forEach(element => {
        this.photoList.push(element)
      });
      console.info('photoViewPicker.select to file succeed and uris are:' + uris);
    }).catch((err: BusinessError) => {
      console.error(`Invoke photoViewPicker.select failed, code is ${err.code}, message is ${err.message}`);
    })
  }


  async invokeCamera(callback: (uri: string) => void) {
    try {
      let pickerProfile: cameraPicker.PickerProfile = {
        cameraPosition: camera.CameraPosition.CAMERA_POSITION_BACK
      };
      let pickerResult: cameraPicker.PickerResult = await cameraPicker.pick(getContext(),
        [cameraPicker.PickerMediaType.PHOTO, cameraPicker.PickerMediaType.VIDEO], pickerProfile);
      console.log("the pick pickerResult is:" + JSON.stringify(pickerResult));
      if (callback && pickerResult) {
        callback(pickerResult.resultUri);
      }
    } catch (error) {
      let err = error as BusinessError;
      console.error(`the pick call failed. error code: ${err.code}`);
    }
  }


  build() {
    Column(){
      TextArea({placeholder:'这一刻的想法'})
        .placeholderFont({size:16})
        .placeholderColor('rgb(188,188,188)')
        .width('100%')
        .height(100)
        .backgroundColor(Color.White)


      Grid(){
        ForEach(this.photoList,(str:string,index)=>{
          GridItem(){
            Image(str)
              .width(90)
              .height(90)
          }
        })
        GridItem(){
          Image($r('app.media.add'))
            .width(90)
            .height(90)
            .onClick(()=>{
              this.dialogController?.open()
            })
        }
      }
      .columnsGap(10)
      .rowsGap(10)
      .columnsTemplate('1fr 1fr 1fr 1fr')
    }
    .padding({left:15,right:15,top:40})


  }
}
资源下载链接为: https://pan.quark.cn/s/f989b9092fc5 在心电信号处理领域,实验(一)“心电2”主要聚焦于心电图(ECG)信号的分析与处理。心电图是记录心脏电生理活动的重要工具,被广泛用于临床诊断健康监测。本实验的核心内容分为两部分:一是模拟数据的使用,二是RST波的检测。 实验中使用的ECG.mat文件包含了心电图信号的模拟数据。在实际研究教学中,模拟数据常被用来代替真实采集的数据,因为它们能够精确控制、重复生成,且便于开展各种假设性实验。这些模拟数据可能包含正常的心电信号波形,如P波、QRS复合波T波,也可能包含异常情况,如心律不齐、早搏等。通过对这些模拟信号的分析处理,可以深入理解心电图的基本特征,并学习如何提取有用信息,例如心跳周期、心率等。 peakdetect.m是Hooman Sedghamiz在2014年编写的RST波检测程序。RST波,尤其是QRS复合波,是心电图分析的关键部分,因为它标志着心脏心动周期中的一个关键阶段——心室激动。该程序采用基于状态机逻辑的算法,这种算法通常涉及一系列预定义的状态,每个状态对应于心电信号的不同特征或变化。通过这种方式,程序能够有效识别定位QRS波群,从而计算出心率其他相关参数。状态机方法在信号处理中具有良好的鲁棒性适应性,能够处理不同质量复杂性的ECG信号。在心电信号检测中,峰检测是一个核心步骤,它涉及寻找信号中的局部最大值。peakdetect.m可能包含了对信号平滑、阈值设定、波形匹配等预处理步骤,以减少噪声影响并准确捕捉到QRS波的起点终点。这一过程对于识别异常心律、诊断心律失常至关重要。 在实验过程中,学生研究人员可以利用ECG.mat数据peakdetect.m程序进行以下实践操作:1. 加载并可视化心电图信号,了解其基本形态特征;2. 运行peakdet
斑马 Zebra ZT410 是一款工业条码打印机,具有打印速度快、分辨率可选、连接方式多样等特点,适用于快递物流、服装、医疗等多个行业: 打印性能: 打印方式:支持热转印直热式热敏两种打印方式,可根据不同需求灵活选择。 分辨率:标准分辨率为 203dpi,还可选配 300dpi 或 600dpi,能满足不同精度要求的打印任务。 打印速度:最大打印速度可达 14ips(每秒 356 毫米),可快速完成大量标签打印工作。 打印宽度与长度:最大打印宽度为 4.09 英寸(104 毫米)。不同分辨率下打印长度不同,203dpi 时为 3988 毫米,300dpi 时为 1854 毫米,600dpi 时为 991 毫米。 内存配置:标配 256MB RAM 内存 512MB 闪存,可存储大量标签格式数据,确保打印任务的顺畅进行。 介质与碳带: 介质类型:支持连续纸、模切纸、有凹口的纸、黑标纸等多种介质。 介质尺寸:介质卷筒宽度(标签底纸)为 1.00 英寸(25.4 毫米)至 4.50 英寸(114 毫米)(撕 / 切纸器),或 1.00 英寸(25.4 毫米)至 4.25 英寸(108 毫米)(剥离 / 回卷),非连续标签最大长度为 39 英寸(991 毫米)。 碳带规格:碳带标准长度为 450 米,宽度为 2.00 英寸(51 毫米)至 4.33 英寸(110 毫米),碳带墨面向外卷绕,也可选配墨面向内卷绕的碳带卷轴。 接口与连接:配备 USB 2.0、高速 RS-232 串行、10/100 以太网、蓝牙 2.1 等接口,还可选择并行接口,支持 ZebraNet 打印机服务器,能连接多种设备,实现便捷的数据传输网络打印。 外观与结构:采用金属框架具有超大透明视窗的两折金属介质盖,结构坚固耐用。侧面加载耗材路径,方便介质碳带的装载。机身尺寸为 495
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值