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

Camera.MAUI:布局扩展致预览模糊、录制时异常放大问题求助

解决Camera.MAUI的预览模糊与录制放大问题

1. 修复预览模糊(填充空间且保留原生分辨率)

问题根源是FillAndExpand会让CameraView默认拉伸低分辨率预览帧填充空间,导致模糊。需要强制使用设备支持的最佳预览分辨率,并保持相机原生宽高比,避免拉伸变形。

修改XAML布局

调整CameraView属性,添加分辨率策略配置并指定宽高比模式:

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:cv="clr-namespace:Camera.MAUI;assembly=Camera.MAUI">
    <Grid>
        <cv:CameraView x:Name="cameraView"         
                       HorizontalOptions="FillAndExpand"
                       VerticalOptions="FillAndExpand"
                       Aspect="AspectFill"
                       CameraOptions="{Binding CameraSettings}"/>
        <Label x:Name="timerLabel"
               Text="00:00"
               HorizontalOptions="Start"
               VerticalOptions="Start"
               Margin="10"
               FontSize="20"
               TextColor="Red"
               IsVisible="False" />
        <Button x:Name="controlButton"
                Text="Start Recording"
                VerticalOptions="End"
                HorizontalOptions="Center"
                Clicked="OnCaptureClicked"/>
    </Grid>
</ContentPage>

后台代码配置最佳分辨率

在相机加载完成后,手动选择设备支持的最高预览分辨率,同时匹配录制分辨率的宽高比:

public CameraPage()
{
    InitializeComponent();
    cameraView.CamerasLoaded += CameraView_CamerasLoaded;
}

private void CameraView_CamerasLoaded(object sender, EventArgs e)
{
    if (cameraView.NumCamerasDetected > 0)
    {
        var camera = cameraView.Cameras.First();
        cameraView.Camera = camera;

        // 筛选设备支持的最高预览分辨率
        var bestPreviewRes = camera.SupportedResolutions.OrderByDescending(r => r.Width * r.Height).First();
        // 选择与预览分辨率比例一致的最高录制分辨率
        var bestRecordRes = camera.SupportedVideoResolutions
            .OrderByDescending(r => r.Width * r.Height)
            .First(r => (double)r.Width / r.Height == (double)bestPreviewRes.Width / bestPreviewRes.Height);

        cameraView.CameraOptions = new CameraOptions
        {
            PreviewResolution = bestPreviewRes,
            VideoRecordingResolution = bestRecordRes,
            EnableHighResolution = true
        };

        if (cameraView.NumMicrophonesDetected > 0)
            cameraView.Microphone = cameraView.Microphones.First();

        MainThread.BeginInvokeOnMainThread(async () =>
        {
            if (await cameraView.StartCameraAsync() == CameraResult.Success)
            {
                controlButton.Text = "Start Recording";
            }
        });
    }
}

2. 修复录制时过度放大问题

录制时放大是因为录制分辨率与预览分辨率宽高比不匹配,导致CameraView自动调整缩放。上述代码通过强制预览与录制分辨率使用相同宽高比,从根源解决了画面异常放大的问题。

额外优化提示

  • 若AspectFill导致画面边缘裁剪,可改用AspectFit模式,但会留出黑边,根据产品需求选择。
  • 部分老旧设备可能不支持最高分辨率,可添加 fallback 逻辑,选择次优适配的分辨率。

内容的提问来源于stack exchange,提问作者Arjun-S96

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 23:53:10