现在的位置: 首页 > 综合 > 正文

使用 Windows Phone 应用程序中的相机功能

2013年01月02日 ⁄ 综合 ⁄ 共 5697字 ⁄ 字号 评论关闭

使用 Windows Phone 应用程序中的相机功能

Matt
Stroshane

通过图片进行沟通交流是一种高效且优雅的方式,而只借助文字进行沟通是无法与之媲美的。 您听说过“一图抵千言”吧;请想象一下,当您的
Windows Phone 应用程序能够直接访问相机功能时您可以解决的各种问题。
 从 Windows Phone 7.5 开始,您可以开始使用设备中的相机功能解决这些难于用语言描述的问题。

在本文中,我将介绍前置和后置相机、相机 API 及相关的清单功能,我还将讨论您可以在下一版本的 Windows Phone 7.5 应用程序中使用相机功能的几种不同方式。 我将讨论以下内容:

  • 拍摄照片: 我将创建一个非常简单的照片应用程序。
  • 访问相机预览缓冲区: 我将介绍“相机灰度示例”。
  • 录制视频: 我将介绍“录像机示例”。

您将需要使用 Windows Phone SDK 7.1 创建一个 Windows Phone 7.5 应用程序。 
SDK 包括一些极为详尽地演示其中每个方案的代码示例。
 有关详细信息,请参阅 SDK 中“代码示例”页(网址为wpdev.ms/officialsamples)上的“基本相机示例”、“相机灰度示例”和“录像机示例”。

请注意,本文不介绍自 Windows Phone 7 以来提供的相机捕捉任务。 尽管该任务是一种为应用程序获取照片的简单方式,但它不允许您以编程方式拍摄照片或访问相机预览缓冲区。

Windows Phone 7.5 设备最多可以包括两个相机,即一个主相机和一个前置相机。 主相机位于设备的背面,与前置相机相比,它通常可提供较高的分辨率和更多功能。 这两个相机在
Windows Phone 7.5 设备中都不是必需的,因此,请确保在创建相机对象之前,在您的代码中检查这些相机的状态。
 稍后,我将演示如何使用静态 IsCameraTypeSupported
方法实现此目的。

在美国地区销售的许多 Windows Phone 设备均包括一个主相机,该相机具有 5MP 或更高像素的传感器、闪光灯和自动聚焦功能。 前置相机是
Windows Phone 7.5 中的新增功能。

有关设备规格的详细信息,请参阅 windowsphone.com 上的“购买”选项卡。

拍摄照片

您可以使用相同的类同时访问主相机和前置相机。 您将看到,选择相机类型就是在
PhotoCamera 对象的构造函数中指定一个参数。
 但是,从设计角度而言,您可能希望采用不同的方式来处理与前置相机的交互。例如,您可能希望从前置相机翻转图像,以便为用户提供更自然的镜像体验。

在使用 Windows Phone 7.5 应用程序拍摄照片时,您将主要使用 Microsoft.Devices 命名空间中的 PhotoCamera 类。 该类对相机设置和行为提供大量控制。 例如,您可以:

  • 使用 PhotoCamera.CaptureImage 方法激活相机快门
  • 使用 PhotoCamera.Focus 方法触发自动聚焦
  • 通过设置 Photo-Camera.Resolution 属性指定图片分辨率
  • 通过设置 Photo-Camera.FlashMode 属性指定闪光灯设置
  • 使用静态 CameraButtons 类中的事件合并硬件快门按钮
  • 使用 PhotoCamera.Focus­AtPoint 方法实现触控聚焦

在本文中,我将只演示第一点。 有关演示如何执行所有这些操作的示例,请参阅
Windows Phone SDK 代码示例页中的“基本相机示例”。

值得注意的是,即使相机可供使用,它也可能并不支持所有这些 API。 以下几种方法可以帮助确定可供使用的功能:

  • 相机: 使用 PhotoCamera.IsCameraTypeSupported 静态方法。
  • 自动聚焦: 使用 PhotoCamera.IsFocus­­-Supported 方法。
  • 图片分辨率设置: 检查 Photo­-Camera.AvailableResolutions 集合。
  • 闪光灯设置: 使用 PhotoCamera.IsFlashMode­Supported 方法。
  • 特定点聚焦: 使用 PhotoCamera.IsFocus­AtPointSupported 方法。

为使您了解如何使用应用程序拍摄照片,我将指导您创建一个简单的应用程序,该应用程序会在您触摸取景器时拍摄照片,然后将照片保存到图片中心的“本机照片”文件夹中。

可使用 Windows Phone 应用程序模板从标准 Windows Phone 项目开始。 您可以在
C# 或 Visual Basic 中编写 Windows Phone 7.5 应用程序。
 本示例将使用 C#。

我会通过将应用程序限制为仅横向方向以及仅使用主相机来简化本示例。 管理设备和两个相机的方向,如果每个都指向不同的方向,很快会令人困惑;建议使用物理设备进行测试,以确保获得所需的行为。 我将在稍后更详细地介绍方向。

在 MainPage.xaml 上,更新 PhoneApplicationPage 属性,如下所示:


          SupportedOrientations="Landscape" Orientation="LandscapeLeft"
        

然后,使用
1
 中所示的 Canvas 和 TextBlock 替换 LayoutRoot Grid 的内容。

图 1 添加 Canvas 和 TextBlock

  1.  
  2.           <Canvas x:Name="viewfinderCanvas" Width="640" Height="480" Tap="viewfinder_Tapped">
  3.   <Canvas.Background>
  4.     <VideoBrush x:Name="viewfinderBrush">
  5.       <VideoBrush.RelativeTransform>
  6.         <CompositeTransform
  7.           x:Name="viewfinderTransform"
  8.           CenterX="0.5"
  9.           CenterY="0.5"/>
  10.       </VideoBrush.RelativeTransform>
  11.     </VideoBrush>
  12.   </Canvas.Background>
  13. </Canvas>
  14. <TextBlock Width="626" Height="40"
  15.            HorizontalAlignment="Left"
  16.            Margin="8,428,0,0"
  17.            Name="txtMessage"
  18.            VerticalAlignment="Top"
  19.            FontSize="24"
  20.            FontWeight="ExtraBold"
  21.            Text="Tap the screen to capture a photo."/>
  22.         


1
 中的 XAML 在 Canvas 中使用 VideoBrush 来显示取景器,并提供用于和用户进行沟通的文本块。
 相机传感器的长宽比为 4:3,而屏幕的长宽比为
15:9。
 如果您不使用同一 4:3 比率指定画布尺寸 (640x480),图像将在屏幕上拉伸显示。

在 Canvas 元素中,Tap 属性指定当用户点击屏幕时调用的方法,即 viewfinder_Tapped 方法。 为从相机预览缓冲区中显示图像流,已将名为
viewfinderBrush 的 Video­Brush 指定为画布的背景。
 与单反 (SLR) 相机中的取景器一样,viewfinderBrush 使您能够查看相机预览帧。 ViewfinderBrush
中的转换实际上会在取景器旋转时将其“固定”到画布的中心。
 我将在以下部分中讨论此 XAML 后面的代码。 
2
 显示该简单照片应用程序的用户界面。

 
图 2 简单照片应用程序的用户界面

初始化和释放相机:要拍摄照片并将照片保存到图片中心的“本机照片”文件夹中,您将分别需要 PhotoCamera 和 MediaLibrary 类。 首先添加对
Microsoft.Xna.Framework 程序集的引用。
 对于本示例,您无需了解 XNA 编程;但是,您确实需要此程序集中的类型,以便访问媒体库。

在 MainPage.xaml.cs 文件的顶部,为相机和媒体库添加指令:

  1.  
  2.           using Microsoft.Devices;
  3. using Microsoft.Xna.Framework.Media;
  4.         

在 MainPage 类中,添加以下类级别的变量:

  1.  
  2.           private int photoCounter = 0;
  3. PhotoCamera cam;
  4. MediaLibrary library = new MediaLibrary();
  5.         

相机可能需要几秒钟时间来进行初始化。 通过在类级别声明
PhotoCamera 对象,您可在导航到页面时创建该对象,并在离开该页面时将其从内存中删除。
 我们将使用 OnNavigatedTo 和 OnNavigatingFrom
方法实现此目的。

在 OnNavigatedTo 方法中,创建相机对象,注册将要使用的相机事件,并将相机预览设置为取景器、viewfinderBrush 的源。 虽然相机通常在
Windows Phone 7.5 中是可选功能;但在创建相机对象之前检查相机十分重要。
 如果主相机不可用,则该方法会向用户写入一条消息。


3
 中所示的方法添加到 MainPage 类。

图 3 OnNavigatedTo 和 OnNavigatingFrom 方法

  1.  
  2.           protected override void OnNavigatedTo
  3.   (System.Windows.Navigation.NavigationEventArgs e)
  4. {
  5.   if (PhotoCamera.IsCameraTypeSupported(CameraType.Primary) == true)
  6.   {
  7.     cam = new PhotoCamera(CameraType.Primary);
  8.     cam.CaptureImageAvailable +=
  9.       new EventHandler<Microsoft.Devices.ContentReadyEventArgs>
  10.         (cam_CaptureImageAvailable);
  11.     viewfinderBrush.SetSource(cam);
  12.   }
  13.   else
  14.   {
  15.     txtMessage.Text = "A Camera is not available on this device.";
  16.   }
  17. }
  18. protected override void OnNavigatingFrom
  19.   (System.Windows.Navigation.NavigatingCancelEventArgs e)
  20. {
  21.   if (cam != null)
  22.   {
  23.     cam.Dispose();
  24.   }
  25. }
  26.         

当离开页面时,可以使用 OnNavigatingFrom 方法处理相机对象并取消注册任何相机事件。 这有助于将电能消耗降至最低、加快关机速度和释放内存。

拍摄照片:如 XAML 中所示,在用户点击取景器之后,会调用 viewfinder_Tapped 方法。 此方法会在相机准备就绪时启动图像捕获。 如果相机尚未初始化或者当前正在捕获另一个图像,则会引发异常。 为帮助减少异常情况,请考虑禁用触发照片拍摄的机制,直到触发
Initialized 事件。
 为简便起见,在本示例中,我们将跳过这一步骤。


4
 显示需要添加到 MainPage 类的代码。

图 4 viewfinder_Tapped 方法

  1.  
  2.           void viewfinder_Tapped(object sender, GestureEventArgs e)
  3. {
  4.   if (cam != null)
  5.   {
  6.     try
  7.     {
  8.       cam.CaptureImage();
  9.     }
  10.     catch (Exception ex)
  11.     {
  12.       this.Dispatcher.BeginInvoke(delegate()
  13.       {
  14.         txtMessage.Text = ex.Message;
  15.       });
  16.     }
  17.   }
  18. }
  19.         

拍摄照片和保存照片是异步任务。 调用
CaptureImage 方法后,会启动一系列事件并且控制权将传递回 UI。

5
 中的事件序列图所示,每个图像捕获过程都包含两个阶段。
 首先,相机传感器拍摄照片,然后根据传感器数据创建图像。

 
图 5 PhotoCamera 类的图像捕获事件序列

保存照片:在传感器拍摄照片后,会并行创建两个图像文件:一个完整尺寸的图像文件和一个缩略图。 您没有必要使用这两个文件。 每个文件均作为相应事件参数中
e.ImageStream 属性中的 JPG 图像流提供。

媒体库会自动创建其自己的缩略图,以便在设备的图片中心中显示,因此本示例不需要图像的缩略图版本。但是,如果您希望在自己的应用程序中显示缩略图,Capture­ThumbnailAvailable
事件处理程序中的 e.ImageStream 将是一个有效的选择。

当该图像流可用时,您可以使用它将图像保存到多个位置。 例如:

  • “本机照片”文件夹: 使用 MediaLibrary.SavePictureToCameraRoll 方法。
  • “已保存图片”文件夹: 使用 MediaLibary.Save­-Picture 方法。
  • 独立存储: 使用 IsolatedStorageFile­-Stream.Write 方法。

在本示例中,我们会将图像保存到“本机照片”文件夹。 有关如何将图像保存到独立存储的示例,请参阅
Windows Phone SDK 中的“基本相机示例”。
 
6
 中的代码添加到 MainPage 类。


图 6 将图像保存到“本机照片”文件夹

抱歉!评论已关闭.