Windows Phone深入浅出入门教程三(PhotoFun 应用程序)
来源:广州中睿信息技术有限公司官网
发布时间:2012/10/21 23:25:16 编辑:itlead 阅读 1538
上一章主要讲了Launchers和Choosers。相信大家对WindowsPhone已有不少了解,这一章我们主讲PhotoFun应用程序。由于微软提供了公共规格定义,所有的WindowsPhone



  上一章主要讲了Launchers和Choosers。相信大家对Windows Phone已有不少了解,这一章我们主讲PhotoFun 应用程序。

 

  由于微软提供了公共规格定义,所有的Windows Phone设备必须有500万像素以上的摄像头。在Windows Phone 7.0中,应用程序想调用摄像头只能使用CameraCaptureTask chooser。一个应用程序可以使用chooser来得到内置摄像头的照片。

  新的Windows Phone Mango版本提供了更多摄像头的集成功能,包括在Microsoft.Devices.PhotoCamera类中,该类提供了摄像头的细粒度控件,并且可以让你的应用程序直接访问摄像头空间和原始数据。

  本次实验演示了如何使用PhotoCamera API来捕捉live camera feed和操作相机显示预览。
 

  一、 捕捉和显示 live camera feed

  这次任务将显示如何使用 Microsoft.Devices.PhotoCamera 类,并为摄像头的正确使用提供一些指导。

  提示:使用DeviceStatus类需要添加对Microsoft.Phone程序集的引用。该引用将会默认出现在Windows Phone 7 Mango的应用程序工程中。

  当你的应用程序导航到某个页面或离开时,Windows Phone 页面的导航模块会调用PhoneApplicationPage的OnNavigatedTo 和 OnNavigatedFrom 方法。当预览界面显示时,这些方法将被调用。。

  使用这两个方法来创建和释放资源,能够让页面访问摄像头并且实现预览。你会在OnNavigatedTo方法中创建PhotoCamera类的实例,在OnNavigatedFrom方法中释放。

 

  1、新建一个Windows phone 7 应用程序,打开 MainPage.xaml.cs 文件,并且声明一个PhotoCamera类型的私有变量:

   1.jpg

  提示:PhotofunDataContext属性会提供一个DataContext属性的强类型封装,方便后续代码中使用。



  2. 重载 OnNavigatedTo 方法,当页面活动时,创建一个PhotoCamera的实例:

    2.1.jpg

    2.2.jpg

  3. 摄像头的初始化需要一些时间。当初始化完成时,PhotoCamera类会触发Initialized事件。在OnNavigatedTo方法中添加摄像头的初始化Initialized事件处理方法:

    3.1.jpg

  在 camera_Initialized 事件处理函数中, 指定摄像头的分辨率,并准备UI来显示视频。AvailableResolutions列表按照每个分辨率的像素数量(宽X高)进行排序,因此第一个分辨率是最低的分辨率。本次实验将使用手机的CPU为live camera feed提供多种效果,但不包括性能优化。为了提高性能我们在这里使用最低分辨率。

  为了保证视频在整个屏幕上显示,更新矩形的宽和高.

    3.2.jpg

  提示:PhotoCamera没有使用UI线程来触发事件。所以,任何针对UI的修改必须使用Dispatcher.BeginInvoke().



  4. 为了显示 live camera feed, 使用名为 viewfinderBrush的VideoBrush, 已经声明在XAML中了。 这个 VideoBrush 是在Windows Phone “Mango”中加入的一个新类型的 Brush. 它可以被用在任意一个可以使用Brush类的地方,用来“绘制”一个视频流。在这个应用程序中,视频流来自camera live feed。为了将live feed连接到viewfinderBrush上,调用brush的SetSource扩展方法:

    4.jpg

  5. 在运行该应用程序之前, 你必须告诉Windows Phone 7你的应用程序使用摄像头。修改 Properties\WMAppManifest.xml f文件,并添加摄像头兼容性声明。如果没有应用程序manifest中的声明,当你尝试访问摄像头时,该应用程序将会抛出异常。在Capabilities元素中,添加ID_CAP_ISV_CAMERA如下实例:

    5.jpg

  6. 现在,您的应用程序可以显示live camera feed了,接下来添加对于照片快照的支持,并将照片保存到 media library中。当用户按下摄像头按钮时,摄像头CameraButtons类的ShutterKeyPressed事件将被触发。然后第一步是初始化照片捕捉操作。类是一个static类,用来帮助将所有的摄像头按钮事件集中在一个单独的地方。在添加Initialized事件之后,在OnNavigatedTo方法中添加事件处理方法。

    6.jpg

  7. 因为CameraButtons类是static类,如果开发者忘记取消对这些事件的订阅,将会引发这些应用程序的一些不确定行为。找到OnNavigatedFrom方法,并将下列代码添加到方法的开始部分:

    7.jpg

  8. 在摄像头拍摄照片之后,如果应用程序拍摄完成,将产生CaptureImageAvailable事件,并且将照片以stream的方式传递给应用程序。

  在OnNavigatedTo方法中,添加 CaptureImageAvailable 事件:

   8.jpg

  SavePicture 方法会将图片刘转换为WriteableBitmap, 该对象最终会被保存到media library中。注意 WritableBitmap 派生自 DependencyObject。 SavePicture 方法也会更新UI (例如当一个预览被添加)。因为UI 和 DependencyObjects 只能通过Dispatcher线程可以被访问和操作,所以CaptureImageAvailable事件处理函数中使用Dispatcher来调用SavePicture方法。

   8.2.jpg

  SaveCapturedImage 方法创建临时的 MemoryStream, 从WriteableBitmap对象中加载图片数据,并最终将刘传递给MediaLibrary ,保存该图像:

   8.3.jpg

  9. 在SaveCapturedImage方法中访问Media Library时,你的应用程序必须声明 ID_CAP_MEDIALIB 兼容性。再次修改 Properties\WMAppManifest.xml 文件添加media library 兼容性声明。在Capabilities元素中,添加下列元素:

   9.jpg

  10. 当用户拍照时,你应该显示预览界面。在MainPage.xaml中,我们为PhotofunDataContext类的Previews属性添加数据绑定, 来绑定页面。数据绑定超过了本次实验的内容,简单来说,就是当我们添加照片到Previews集合时,UI会自动显示这些照片。

  修改 SavePicture 方法将捕捉照片添加到Previews集合中:

    10.jpg

  应用程序现在能够使用VideoBrush将live camera feed绘制到应用程序界面上了。 这也可以拍照并将照片保存到MediaLibrary中,还可以在拍照时预览。

  至此,Windows Phone PhotoFun学习完毕。

  

    

本站技术原创栏目文章均为中睿原创或编译,转载请注明:文章来自中睿,本站保留追究责任的权利。

  
联系我们CONTACT 扫一扫
愿景:成为最专业的软件研发服务领航者
中睿信息技术有限公司 广州•深圳 Tel:020-38931912 务实 Pragmatic
广州:广州市天河区翰景路1号金星大厦18层中睿信息 Fax:020-38931912 专业 Professional
深圳:深圳市福田区车公庙有色金属大厦509~510 Tel:0755-25855012 诚信 Integrity
所有权声明:PMI, PMP, Project Management Professional, PMI-ACP, PMI-PBA和PMBOK是项目管理协会(Project Management Institute, Inc.)的注册标志。
版权所有:广州中睿信息技术有限公司 粤ICP备13082838号-2