开发者社区> 杰克.陈> 正文

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

简介: 参考:wp8.1之拍照(获取焦点,使用后置摄像头) uwp开启摄像头要借助CaptureElement呈现来自捕获设备(如照相机或网络摄像机)的流。今天讲讲如何打开摄像头,获取焦点,以及拍照。废话不多说,下面直接上代码。
+关注继续查看

参考: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 { }
        }

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
干货:P2P直连访问---家用摄像头安全使用姿势
随着家用安防摄像头使用的增多,有关安全隐私的问题层出不穷。本文以TP-LINK摄像头为例,旨在探索如何远程直连方式安全使用安防设备
203 0
如何使用 ABAP 手动解析 multipart/form-data 格式的数据
如何使用 ABAP 手动解析 multipart/form-data 格式的数据
37 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
20119 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
18407 0
查看磁盘阵列 使用率(简单)
<div style="margin:0px; padding:0px; border:0px; line-height:1.57143em; font-family:gotham,helvetica,arial,sans-serif; font-size:14px; color:rgb(56,56,56)"> <span color="#00B4AE" face="宋体, Lucida
1511 0
FFMPEG音频开发: Linux下采集摄像头(使用V4L2框架)数据录制成MP4视频保存到本地
FFMPEG音频开发: Linux下采集摄像头(使用V4L2框架)数据录制成MP4视频保存到本地
165 0
python使用opencv驱动摄像头
#coding:utf-8 import cv2 import sys from PIL import Image def CatchUsbVideo(window_name, camera_idx): cv2.
942 0
+关注
杰克.陈
一个安静的程序猿~
10427
文章
2
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载