当前位置:首页 > 科技  > 软件

如何调用设备摄像头进行拍照、预览并将拍摄结果保存在媒体库中(Camera)

来源: 责编: 时间:2023-12-20 17:45:56 172观看
导读想了解更多关于开源的内容,请访问:51CTO 开源基础软件社区https://ost.51cto.com场景说明调用设备摄像头进行拍照、预览是许多应用开发过程中都需要的功能。在拍照完成时显示照片预览图可以确认拍摄的照片是否达到预期,

I0D28资讯网——每日最新资讯28at.com

想了解更多关于开源的内容,请访问:I0D28资讯网——每日最新资讯28at.com

51CTO 开源基础软件社区I0D28资讯网——每日最新资讯28at.com

https://ost.51cto.comI0D28资讯网——每日最新资讯28at.com

场景说明

调用设备摄像头进行拍照、预览是许多应用开发过程中都需要的功能。在拍照完成时显示照片预览图可以确认拍摄的照片是否达到预期,本例将为大家介绍如何实现上述功能。I0D28资讯网——每日最新资讯28at.com

效果呈现

本例效果如下:I0D28资讯网——每日最新资讯28at.com

拍照I0D28资讯网——每日最新资讯28at.com

预览I0D28资讯网——每日最新资讯28at.com

I0D28资讯网——每日最新资讯28at.com

I0D28资讯网——每日最新资讯28at.com

运行环境

本例基于以下环境开发,开发者也可以基于其他适配的版本进行开发。I0D28资讯网——每日最新资讯28at.com

  • IDE:DevEco Studio 4.0.0.201 Beta1
  • SDK:Ohos_sdk_public 4.0.7.5 (API Version 10 Beta1)

实现思路

本例使用@ohos.multimedia.camera接口实现相机示例的主要功能:拍照、预览;I0D28资讯网——每日最新资讯28at.com

  • 拍照:XComponent组件负责绘制摄像头画面呈现的窗口,其onload事件调用cameraModel.ts的initCamera方法初始化相机功能输出画面信息。拍照动作使用Image组件实现,其onclick事件调用cameraModel.ts的takepicture方法开始拍照。
  • 预览:返回相机界面点击底部左侧预览图可进入相册应用,可以在其中查看照片和录制的视频。

开发步骤

申请所需权限:
在model.json5中添加以下配置:I0D28资讯网——每日最新资讯28at.com

"requestPermissions": [      {        "name": "ohos.permission.CAMERA"//允许应用使用相机拍摄照片和录制视频      },      {        "name": "ohos.permission.MICROPHONE"//允许应用使用麦克风      },      {        "name": "ohos.permission.MEDIA_LOCATION"//允许应用访问用户媒体文件中的地理位置信息      },      {        "name": "ohos.permission.WRITE_MEDIA"//允许应用读写用户外部存储中的媒体文件信息      },      {        "name": "ohos.permission.READ_MEDIA"//允许应用读取用户外部存储中的媒体文件信息      }    ]

创建绘制组件XComponent以输出摄像头获取的画面,其绑定的onload方法中设定了画幅的大小。I0D28资讯网——每日最新资讯28at.com

build() {    Column() {      Title()        .visibility(this.isTitleShow ? Visibility.Visible : Visibility.None)       Stack({ alignContent: Alignment.Bottom }) {        Stack({ alignContent: Alignment.TopStart }) {          XComponent({            id: 'componentId',            type: 'surface',            controller: this.mXComponentController  //将控制器绑定至XComponent组件          })            .onLoad(() => {              this.mXComponentController.setXComponentSurfaceSize({ surfaceWidth: 640, surfaceHeight: 480 });//设置surface大小              this.surfaceId = this.mXComponentController.getXComponentSurfaceId();              this.currentModel = CameraMode.modePhoto;               this.cameraModel.initCamera(this.surfaceId); //调用model/cameraModel.ts初始化相机功能            })            .width('100%')            .height('100%')            .margin({ bottom: 152 })            Column() {        }        .width('97%')        .height('100%')

初始化相机功能initCamera方法通过创建相机管理器实例cameraMgr来创建画面输出对象previewOutput。cameraMgr再通过创建CaptureSession实例来配置会话,完成相机功能的准备工作。I0D28资讯网——每日最新资讯28at.com

import image from '@ohos.multimedia.image';//自@ohos.multimedia.image引入image,提供图片处理效果...private receiver: image.ImageReceiver = undefined;//图像接收类,用于获取组件surface id,接收最新的图片和读取下一张图片...constructor() {    this.mediaModel = MediaModel.getMediaInstance();//通过调用model/MediaModel.ets中的方法创建mediaInstance类mediaModel    //创建ImageReceiver实例receiver    this.receiver = image.createImageReceiver(      cameraWH.width,      cameraWH.height,      FOUR,      EIGHT    );    //接收图片时注册回调    this.receiver.on('imageArrival', () => {       //从ImageReceiver读取下一张图片      this.receiver.readNextImage((err, image) => {        if (err || image === undefined) {          return;        }        //根据图像的组件类型从图像中获取组件缓存         image.getComponent(FOUR, (errMsg, img) => {          if (errMsg || img === undefined) {            return;          }          let buffer = new ArrayBuffer(FOUR_THOUSAND_AND_SIXTY_NINE);          if (img.byteBuffer) {            buffer = img.byteBuffer;          }           this.saveImage(buffer, image);        });      });    });  }async initCamera(surfaceId: string): Promise<void> {    ...    try {      this.cameraMgr = camera.getCameraManager(globalThis.cameraContext);//获取相机管理器实例    }     this.camerasArray = this.cameraMgr.getSupportedCameras();//获取支持指定的相机设备对象    if (this.camerasArray.length === 0) {      return;    }    let mCamera = this.camerasArray[0];    this.cameraInput = this.cameraMgr.createCameraInput(mCamera);    this.cameraInput.open();    this.capability = this.cameraMgr.getSupportedOutputCapability(mCamera);//查询相机设备支持的输出能力    let previewProfile = this.capability.previewProfiles[0];	//通过相机管理器创建预览输出对象    this.previewOutput = this.cameraMgr.createPreviewOutput(      previewProfile,												      surfaceId												//surfaceId从XComponent组件获取    );    let rSurfaceId = await this.receiver.getReceivingSurfaceId();//获取一个surface id供其他组件使用    let photoProfile = this.capability.photoProfiles[0];	//通过相机管理器创建照片输出对象    this.photoOutPut = this.cameraMgr.createPhotoOutput(      photoProfile,      rSurfaceId										//rSurfaceId通过构造函数中定义的图像接收类receiver获取    );    this.capSession = this.cameraMgr.createCaptureSession();//创建CaptureSession实例    this.capSession.beginConfig();//开始配置会话    this.capSession.addInput(this.cameraInput);//将cameraInput加入会话    this.capSession.addOutput(this.previewOutput);//将预览输出加入会话    this.capSession.addOutput(this.photoOutPut);//将照片输出加入会话    await this.capSession.commitConfig();//提交配置信息    await this.capSession.start();//开始输出  }

点击按钮进行拍照,拍照按钮通过Image组件呈现,其绑定的onClick方法调用takePicture方法开始拍照。I0D28资讯网——每日最新资讯28at.com

Image(this.getCameraIcon())              .size({ width: 64, height: 64 })              .margin({ left: 10 })              .id('camera')              .onClick(() => {                if (this.currentModel === CameraMode.modePhoto) {                  prompt.showToast({ message: '拍照中...', duration: 200 });                  this.cameraModel.takePicture();//调用model/cameraModel.takePicture()开始拍照                }               })

拍照功能具体实现:I0D28资讯网——每日最新资讯28at.com

拍照:I0D28资讯网——每日最新资讯28at.com

async takePicture(): Promise<void> {    //设置拍照相关参数    let photoSettings = {      rotation: this.imageRotation,      quality: camera.QualityLevel.QUALITY_LEVEL_MEDIUM,      location: {        // 位置信息,经纬度        latitude: 12.9698,        longitude: 77.75,        altitude: 1000,      },      mirror: false,    };    await this.photoOutPut.capture(photoSettings);    AppStorage.Set('isRefresh', true);  }

保存图片:
saveImage方法使用MediaModel中的createAndGetUri方法创建Image类型资源,将拍摄到的照片写入到这个资源中去。I0D28资讯网——每日最新资讯28at.com

//model/MediaModel.ts中定义的负责保存图片的相关方法async createAndGetUri(mediaType: mediaLibrary.MediaType): Promise<mediaLibrary.FileAsset> {    let dateTimeUtil: DateTimeUtil = new DateTimeUtil();    let info: FileInfo = this.getInfoFromMediaType(mediaType);    let name: string = `${dateTimeUtil.getDate()}_${dateTimeUtil.getTime()}`;//获取当前时间    let displayName: string = `${info.prefix}${name}${info.suffix}`;	//获取公共目录路径。    let publicPath: string = await this.mediaLibraryTest.getPublicDirectory(      info.directory    );//通过引用自@ohos.multimedia.mediaLibrary的mediaLibraryTest类创建媒体资源,其中定义了媒体类型、名称、路径。    let fileAsset: mediaLibrary.FileAsset = await this.mediaLibraryTest.createAsset(      mediaType,//根据传入函数createAndGetUri的mediaType参数决定创建什么类型的媒体资源      displayName,      publicPath    );    return fileAsset;  }  async getFdPath(fileAsset: mediaLibrary.FileAsset): Promise<number> {    let fd: number = await fileAsset.open('Rw');//打开当前文件    return fd;  }...async saveImage(buffer: ArrayBuffer, img: image.Image): Promise<void> {    this.fileAsset = await this.mediaModel.createAndGetUri(mediaLibrary.MediaType.IMAGE);	//通过调用MediaModel中的方法创建Image类型资源    this.photoPath = this.fileAsset.uri;    this.fd = await this.mediaModel.getFdPath(this.fileAsset);    await fileIo.write(this.fd, buffer);//将拍摄的照片写入到Mediamodel传回的资源中去    await this.fileAsset.close(this.fd);//释放open函数    await img.release();    if (this.takePictureHandle) {      this.takePictureHandle(this.photoPath);    }  }

想了解更多关于开源的内容,请访问:I0D28资讯网——每日最新资讯28at.com

51CTO 开源基础软件社区I0D28资讯网——每日最新资讯28at.com

https://ost.51cto.comI0D28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-50742-0.html如何调用设备摄像头进行拍照、预览并将拍摄结果保存在媒体库中(Camera)

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 觅伊 APP 崩了引热议 官方紧急修复

下一篇: 水波纹动画开发(ArkUI)

标签:
  • 热门焦点
  • Find N3入网:最高支持16+1TB

    Find N3入网:最高支持16+1TB

    OPPO将于近期登场的Find N3折叠屏目前已经正式入网,型号为PHN110。本次Find N3在外观方面相比前两代有很大的变化,不再是小号的横向折叠屏,而是跟别的厂商一样采用了较为常见的
  • 7月安卓手机好评榜:三星S23Ultra好评率第一

    7月安卓手机好评榜:三星S23Ultra好评率第一

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年7月1日至7月31日,仅限国内市场。第一名:三星Galaxy S23 Ultra好评率:95.71%在即将迎来新
  • 帅气纯真少年!日本最帅初中生选美冠军出炉

    帅气纯真少年!日本最帅初中生选美冠军出炉

    日本第一帅哥初一生选美大赛冠军现已正式出炉,冠军是来自千叶县的宗田悠良。日本一直热衷于各种选美大赛,从&ldquo;最美JK&rdquo;起到&ldquo;最美女星&r
  • 消息称迪士尼要拍真人版《魔发奇缘》:女主可能也找黑人演员

    消息称迪士尼要拍真人版《魔发奇缘》:女主可能也找黑人演员

    8月5日消息,迪士尼确实有点忙,忙着将不少动画改成真人版,继《美人鱼》后,真人版《白雪公主》、《魔发奇缘》也在路上了。据外媒消息称,迪士尼将打造真人版
  • 梁柱接棒两年,腾讯音乐闯出新路子

    梁柱接棒两年,腾讯音乐闯出新路子

    文丨田静 出品丨牛刀财经(niudaocaijing)7月5日,企鹅FM发布官方公告称由于业务调整,将于9月6日正式停止运营,这意味着腾讯音乐长音频业务走向消亡。腾讯在长音频领域还在摸索。为
  • 大厂卷向扁平化

    大厂卷向扁平化

    来源:新熵作者丨南枝 编辑丨月见大厂职级不香了。俗话说,兵无常势,水无常形,互联网企业调整职级体系并不稀奇。7月13日,淘宝天猫集团启动了近年来最大的人力制度改革,目前已形成一
  • 滴滴违法违规被罚80.26亿 共存在16项违法事实

    滴滴违法违规被罚80.26亿 共存在16项违法事实

    滴滴违法违规被罚80.26亿 存在16项违法事实开始于2121年7月,历经一年时间,网络安全审查办公室对“滴滴出行”网络安全审查终于有了一个暂时的结束。据“网信
  • 上海举办人工智能大会活动,建设人工智能新高地

    上海举办人工智能大会活动,建设人工智能新高地

    人工智能大会在上海浦江两岸隆重拉开帷幕,人工智能新技术、新产品、新应用、新理念集中亮相。8月30日晚,作为大会的特色活动之一的上海人工智能发展盛典人工
  • 电博会上海尔智家模拟500平大平层,还原生活空间沉浸式体验

    电博会上海尔智家模拟500平大平层,还原生活空间沉浸式体验

    电博会为了更好地让参展观众真正感受到智能家居的绝妙之处,海尔智家的程传岭先生同样介绍了展会上海尔智家的模拟500平大平层,还原生活空间沉浸式体验。程传
Top