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
相关产品推荐
相关产品推荐

