当前位置: 首页 > article >正文

鸿蒙Next自定义相机开发时,如何解决相机在全屏预览的时候,画面会有变形和拉伸?

问题描述:为啥相机在全屏预览的时候,画面会有变形和拉伸?

问题分析:

如果你在相机开发的时候,设置的预览画面是全屏的尺寸:meta60 2760/1260=2.19, 预览用的相机尺寸是1920/1080=1.777 那么这个预览画面1.77投在xcomponent2.19比例上,必然会拉伸变形;

所以要全屏预览还要不变形:需要先获取手机的宽高比,用手机的屏幕的height/width去和相机底层支持的预览尺寸的 width/height 去取最贴近的值

也就是cameraOutputCapability.previewProfiles的分辨率列表中选择2336/1080 = 2.16 这套参数,两个比值只相差 0.03 最合适

解决方案

封装方法

 //查找【相机全屏预览宽高】最接近的手机默认分辨率
  findClosestNumber(cameraOutputCapability:camera.CameraOutputCapability,profileType:string):camera.Profile|undefined {
     let profileArr=cameraOutputCapability.previewProfiles;    //预览的分辨率
     if(profileType=='PhotoProfile'){
         profileArr = cameraOutputCapability.photoProfiles;   //相机支持的分辨率列表
      }
      let screenWidth=display.getDefaultDisplaySync().width
      let screenHeight=display.getDefaultDisplaySync().height
      let target:number=0;
      if(profileArr.length < 1) {
        return undefined;
      }
      if(screenWidth&&screenHeight){
          target=screenHeight/screenWidth       //全屏幕宽高比例
       }
      let closest = profileArr[0]; // 初始化最接近的数为数组的第一个元素
      let smallestDifference = Math.abs(profileArr[0].size.width/profileArr[0].size.height - target); // 初始化最小差值为第一个元素与目标值的差值
        for (let i = 1; i < profileArr.length; i++) {
        if(profileArr[i].size.width>=1080){  //避免小分辨率的比例算出来的数据也相临近,只计算分辨率大于1080的
          let currentDifference = Math.abs(profileArr[i].size.width/profileArr[i].size.height - target);
          if (currentDifference <= smallestDifference) {
            smallestDifference = currentDifference;
            closest = profileArr[i];
          }
        }
      }
      return closest;  //返回全屏时候最佳的分辨率


http://www.kler.cn/a/454623.html

相关文章:

  • Leetcode打卡:查询数组中元素出现的位置
  • 经典150-数组/字符串
  • 菜鸟带新鸟——基于EPlan2022的部件库制作(3D)
  • C++ 泛编程 —— 嵌套使用模板类
  • elasticsearch 杂记
  • K8s 不同层次的进程间通信实现
  • 【Agent】Chatbot、Copilot与Agent如何帮助我们的提升效率?
  • 【js】记录预览pdf文件
  • 如何从 0 到 1 ,打造全新一代分布式数据架构
  • Jenkins 命令行多线程并发下载制品包
  • PPT画图——如何设置导致图片为600dpi
  • 青岛市勘察测绘研究院携手云轴科技ZStack获评专有云典型案例
  • Qt工作总结02 <设置工具栏ToolBar>
  • 对于标签推荐算法的应用
  • fpga系列 HDL:跨时钟域同步 shift register同步 + SPI中的同步方式
  • vue.js 组件化开发 根组件
  • 通俗易懂!使用Excel和TF实现Transformer
  • 光谱相机的工作原理
  • 使用Python pickle模块进行序列化
  • 视听语言与手机拍摄技巧
  • SuperMap iClient3D for Cesium等高线标注
  • VSCode 插件开发实战(十四):创建交互式引导教程
  • Qt QByteArray做CRC16-modbus校验
  • 低代码开发 实战转型案例一览
  • 【论文阅读】AllMatch: Exploiting All Unlabeled Data for Semi-Supervised Learning
  • 结构型设计模式