码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-09-27 13:12:06      阅读:224      评论:0      收藏:0      [点我收藏+]

标签:web   closure   return   旋转   code   info   摄像机   ndt   smo   

参考: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之拍照(使用后置摄像头)

标签:web   closure   return   旋转   code   info   摄像机   ndt   smo   

原文地址:http://www.cnblogs.com/lonelyxmas/p/7600662.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!