uwp之拍照(使用后置摄像头)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了uwp之拍照(使用后置摄像头)相关的知识,希望对你有一定的参考价值。

参考:wp8.1之拍照(获取焦点,使用后置摄像头)

uwp开启摄像头要借助CaptureElement呈现来自捕获设备(如照相机或网络摄像机)的流。今天讲讲如何打开摄像头,获取焦点,以及拍照。废话不多说,下面直接上代码。当然前提是一定要记住在appxmanifest文件Capabilities选项选择Webcam,不然会报错

首先 XAML代码:

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <Grid>
            <CaptureElement x:Name="capturePreview" Stretch="UniformToFill" />
            <Image Name="ProfilePic" />
        </Grid>
        <StackPanel VerticalAlignment="Bottom">
            <Slider
                x:Name="FocusValueSlider"
                Margin="12,0,15,0"
                Header="焦点调节:"
                LargeChange="25"
                Maximum="1000"
                Minimum="0"
                SmallChange="1"
                ValueChanged="FocusValueSlider_ValueChanged"
                Value="500" />
            <StackPanel Orientation="Horizontal">
                <Button Click="PhotographButton_Click" Content="启动摄像头" />
                <Button
                    Margin="50,0,0,0"
                    Click="CapturePhoto_Click"
                    Content="拍照" />
            </StackPanel>
        </StackPanel>
    </Grid>
    //启动摄像头
        async private void PhotographButton_Click(object sender, RoutedEventArgs e)
        {
            if (captureManager == null)
            {
                capturePreview.Visibility = Visibility.Visible;
                ProfilePic.Visibility = Visibility.Collapsed;
                captureManager = new MediaCapture();

                //选择后置摄像头
                var cameraDevice = await FindCameraDeviceByPanelAsync(Windows.Devices.Enumeration.Panel.Back);
                if (cameraDevice == null)
                {
                    System.Diagnostics.Debug.WriteLine("No camera device found!");
                    return;
                }
                var settings = new MediaCaptureInitializationSettings
                {
                    StreamingCaptureMode = StreamingCaptureMode.Video,
                    //MediaCategory = MediaCategory.Other,
                    //AudioProcessing = AudioProcessing.Default,
                    //PhotoCaptureSource = PhotoCaptureSource.Photo,
                    AudioDeviceId = string.Empty,
                    VideoDeviceId = cameraDevice.Id
                };
                await captureManager.InitializeAsync(settings);
                //摄像头旋转90度
                //captureManager.SetPreviewRotation(VideoRotation.Clockwise90Degrees);
                capturePreview.Source = captureManager;
                await captureManager.StartPreviewAsync();
            }
        }
        private static async Task<DeviceInformation> FindCameraDeviceByPanelAsync(Windows.Devices.Enumeration.Panel desired)
        {

            var allVideoDevices = await DeviceInformation.FindAllAsync(DeviceClass.VideoCapture);

            DeviceInformation desiredDevice = allVideoDevices.FirstOrDefault(x => x.EnclosureLocation != null && x.EnclosureLocation.Panel == desired);

            return desiredDevice ?? allVideoDevices.FirstOrDefault();
        }
        //拍照
        async private void CapturePhoto_Click(object sender, RoutedEventArgs e)
        {

            if (captureManager != null)
            {
                capturePreview.Visibility = Visibility.Collapsed;
                ProfilePic.Visibility = Visibility.Visible;
                ProfilePic.Source = null;
                //declare string for filename
                string captureFileName = string.Empty;


                //图片格式
                ImageEncodingProperties format = ImageEncodingProperties.CreateJpeg();

                //创建本地存储文件夹
                StorageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync(
                    "Photo"+DateTime.Now.ToString("yyMMddHHmmss")+".jpg",
                    CreationCollisionOption.ReplaceExisting);


                await captureManager.CapturePhotoToStorageFileAsync(format, file);


                BitmapImage bmpImage = new BitmapImage(new Uri(file.Path));


               ProfilePic.Source = bmpImage;//释放摄像头资源
                capturePreview.Visibility = Visibility.Visible;
                ProfilePic.Visibility = Visibility.Collapsed;
                //captureManager.Dispose();
                //captureManager = null;
            }

        }
        private void FocusValueSlider_ValueChanged(object sender, RangeBaseValueChangedEventArgs e)
        {
            try
            {

                uint focus = Convert.ToUInt32(e.NewValue);
                SetFocus(focus);
            }
            catch
            {

            }
        }
        //设置摄像头焦点方法
        private async void SetFocus(uint? focusValue = null)
        {

            try
            {

                if (!focusValue.HasValue)
                {
                    focusValue = 500;
                }


                if (captureManager.VideoDeviceController.FocusControl.Supported)
                {

                    captureManager.VideoDeviceController.FlashControl.AssistantLightEnabled = false;


                    captureManager.VideoDeviceController.FocusControl.Configure(new FocusSettings() { Mode = FocusMode.Manual, Value = focusValue, DisableDriverFallback = true });

                    await captureManager.VideoDeviceController.FocusControl.FocusAsync();
                }
            }
            catch { }
        }

 

以上是关于uwp之拍照(使用后置摄像头)的主要内容,如果未能解决你的问题,请参考以下文章

Android 11.0 修复Camera 启用后置摄像头在拍照界面下,白平衡按钮无法点击

iOS 摄像头应用,从前置摄像头切换到后置摄像头时闪烁

c#利用AForge来进行摄像头拍照功能。请问可否设置保存图片的大小。

使用本机反应更改相机类型后立即拍照

UIImageOrientation 与相机

如何使用HTML5实现利用摄像头拍照上传功能