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 { }
  }

这样就完成了焦点获取。 

 

  

posted on   一梦十年  阅读(421)  评论(0编辑  收藏  举报

< 2025年2月 >
26 27 28 29 30 31 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 1
2 3 4 5 6 7 8

导航

统计

点击右上角即可分享
微信分享提示