wp8.1之拍照(获取焦点,使用后置摄像头)
wp8.1 没有像wp8一样直接用启动器开启摄像头,他要开启摄像头要借助CaptureElement呈现来自捕获设备(如照相机或网络摄像机)的流。今天讲讲如何打开摄像头,获取焦点,以及拍照。废话不多说,下面直接上代码。当然前提是一定要记住在appxmanifest文件Capabilities选项选择Webcam,不然会报错
首先 XAML代码:
1 2 3 4 5 6 7 8 9 10 11 12 | <Grid Name= "LayoutRoot" > <CaptureElement x:Name= "capturePreview" Stretch= "UniformToFill" /> <Image Name= "ProfilePic" ></Image> </Grid> <StackPanel Grid.Row= "1" VerticalAlignment= "Bottom" > <Slider x:Name= "FocusValueSlider" Maximum= "1000" Minimum= "0" Grid.Row= "0" Margin= "12,0,15,0" Header= "焦点调节:" ValueChanged= "FocusValueSlider_ValueChanged" Value= "500" SmallChang e= "1" LargeChange= "25" ></Slider> <StackPanel Orientation= "Horizontal" > <Button Content= "启动摄像头" Click= "PhotographButton_Click" ></Button> <Button Margin= "50,0,0,0" Content= "拍照" Click= "CapturePhoto_Click" ></Button> </StackPanel> </StackPanel> |
然后是启动摄像头 事件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | MediaCapture captureManager = null ; async private void PhotographButton_Click( object sender, RoutedEventArgs e) { if (captureManager == null ) { capturePreview.Visibility = Visibility.Visible; ProfilePic.Visibility = Visibility.Collapsed; captureManager = new MediaCapture(); //选择后置摄像头 var cameraID = await GetCameraID(Windows.Devices.Enumeration.Panel.Back); await captureManager.InitializeAsync( new MediaCaptureInitializationSettings { StreamingCaptureMode = StreamingCaptureMode.Video, PhotoCaptureSource = PhotoCaptureSource.Photo, AudioDeviceId = string .Empty, VideoDeviceId = cameraID.Id }); //摄像头旋转90度 captureManager.SetPreviewRotation(VideoRotation.Clockwise90Degrees); capturePreview.Source = captureManager; await captureManager.StartPreviewAsync(); } } |
获取后摄像头方法:
1 2 3 4 5 6 7 8 | private static async Task<DeviceInformation> GetCameraID(Windows.Devices.Enumeration.Panel desired) { DeviceInformation deviceID = (await DeviceInformation.FindAllAsync(DeviceClass.VideoCapture)) .FirstOrDefault(x => x.EnclosureLocation != null && x.EnclosureLocation.Panel == desired); if (deviceID != null ) return deviceID; else throw new Exception( string .Format( "Camera of type {0} doesn't exist." , desired)); } |
接下来是拍照方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | async private void CapturePhoto_Click( object sender, RoutedEventArgs e) { if (captureManager != null ) { capturePreview.Visibility = Visibility.Collapsed; ProfilePic.Visibility = Visibility.Visible; //declare string for filename string captureFileName = string .Empty; //图片格式 ImageEncodingProperties format = ImageEncodingProperties.CreateJpeg(); //创建本地存储文件夹 StorageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync( "Photo.jpg" , CreationCollisionOption.ReplaceExisting); await captureManager.CapturePhotoToStorageFileAsync(format, file); BitmapImage bmpImage = new BitmapImage( new Uri(file.Path)); ProfilePic.Source = bmpImage; <br> //释放摄像头资源 captureManager.Dispose(); captureManager = null ; } } |
上面已经就完成了 拍照的一般流程,现在讲讲获取焦点,获取焦点的方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | private void FocusValueSlider_ValueChanged( object sender, RangeBaseValueChangedEventArgs e) { try { uint focus = Convert.ToUInt32(e.NewValue); SetFocus(focus); } catch { } }<br> //设置摄像头焦点方法 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 { } } |
这样就完成了焦点获取。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步