如何获取CommunityToolkit.Maui中CameraView的当前预览尺寸?
解决.NET MAUI中CommunityToolkit.Maui CameraView预览实际尺寸获取问题
一、获取屏幕上的实际显示尺寸(解决Width/Height返回0的问题)
别在控件初始化阶段直接读Width/Height,这时候控件还没完成布局渲染,肯定拿不到有效值。改用SizeChanged事件,它会在控件尺寸确定或变化时触发,能拿到准确的屏幕显示宽高:
XAML 写法
<toolkit:CameraView x:Name="MyCameraView" CameraLoaded="MyCameraView_CameraLoaded" SizeChanged="MyCameraView_SizeChanged" />
后台代码
private void MyCameraView_SizeChanged(object sender, EventArgs e) { if (sender is CameraView cameraView) { // 此时的Width和Height就是屏幕上的实际显示尺寸 double displayWidth = cameraView.Width; double displayHeight = cameraView.Height; // 这里可以直接做叠加图形布局或坐标计算 } }
二、获取相机原生视频帧的实际尺寸
如果要把帧上的坐标映射到屏幕显示坐标,还得拿到相机输出的原始帧尺寸,这要在CameraLoaded事件里获取:
private void MyCameraView_CameraLoaded(object sender, CameraLoadedEventArgs e) { // 获取当前相机的信息 var cameraInfo = e.Camera; // 获取当前使用的视频格式(包含帧的宽高) var videoFormat = cameraInfo.VideoFormat; int frameWidth = videoFormat.Width; int frameHeight = videoFormat.Height; // 保存下来用于后续坐标转换 }
三、实现屏幕坐标与帧坐标的映射
相机预览会根据屏幕尺寸做拉伸/适配,需要计算缩放比例来转换坐标,保证叠加图形和预览内容对齐:
// 假设已经拿到displayWidth、displayHeight(屏幕显示尺寸)和frameWidth、frameHeight(帧尺寸) double scaleX = displayWidth / frameWidth; double scaleY = displayHeight / frameHeight; // 取最小的缩放比例,和CameraView默认适配逻辑一致,避免拉伸变形 double actualScale = Math.Min(scaleX, scaleY); // 帧上的点(xFrame, yFrame)转换为屏幕上的点(xDisplay, yDisplay) double xDisplay = (xFrame * actualScale) + (displayWidth - frameWidth * actualScale) / 2; double yDisplay = (yFrame * actualScale) + (displayHeight - frameHeight * actualScale) / 2;
注意事项
SizeChanged可能会触发多次(比如屏幕旋转、窗口大小变化),要做好逻辑防抖或重复处理的准备CameraLoaded只有在相机成功初始化后才会触发,如果相机权限未授予或初始化失败,不会执行该事件
内容的提问来源于stack exchange,提问作者ni hao ya ha ha
相关产品推荐
相关产品推荐

