You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 17:12:05