鸿蒙Next如何处理相机在全屏预览的时候,画面会有变形和拉伸的问题?
2025-01-03 11:01:53
32次阅读
0个评论
问题描述:鸿蒙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; //返回全屏时候最佳的分辨率
00
- 0回答
- 0粉丝
- 0关注
相关话题
- 如何通过系统相机拍照和录像
- 鸿蒙Navigation处理启动页跳转到首页问题
- OpenHarmony: 如何通过路由跳转到一个只有页面没有UIAbility的模块
- 探索如何更有效的使用DevEcoStudio开发工具
- 【HarmonyOS NEXT】如何给未知类型对象定义类型并使用递归打印所有的Key
- 双路预览
- Flutter 鸿蒙化 flutter和鸿蒙next混和渲染
- HarmonyOS Next 如何优雅的编写注释
- harmony-dialog 效果预览
- Flutter鸿蒙化 在鸿蒙应用中添加Flutter页面
- OpenHarmony: 优化import依赖树较大的问题
- 【HarmonyOS】时间处理Dayjs
- 如何加载和使用自定义字体
- [HarmonyOS]解决HMRouter路由地址无法抽取的问题
- 在OpenHarmony开发者论坛:贡献你的力量