Windows Phone 开发——相机功能开发

简介: 原文:Windows Phone 开发——相机功能开发  相机功能是手机区别于PC的一大功能,在做手机应用时,如果合理的利用了拍照功能,可能会给自己的应用增色很多。使用Windows Phone的相机功能,有两种方法,一种是使用PhotoCamera类来构建自己的相机UI,另外一种是通过CameraCaptureTask选择器来实现该功能。
原文: Windows Phone 开发——相机功能开发

  相机功能是手机区别于PC的一大功能,在做手机应用时,如果合理的利用了拍照功能,可能会给自己的应用增色很多。使用Windows Phone的相机功能,有两种方法,一种是使用PhotoCamera类来构建自己的相机UI,另外一种是通过CameraCaptureTask选择器来实现该功能。

他们的区别是:

  • PhotoCamera类允许应用控制照片属性,如 ISO、曝光补偿和手动对焦位置,应用可以对照片有更多的控制,当然也会麻烦很多。需要实现闪光灯、对焦、分辨率、快门按钮等操作。
  • CameraCaptureTask拍照会调用系统的相机功能,返回一个有照片数据的返回值,同时一旦拍照,就会进入手机相册。

 

. CameraCaptureTask选择器。

  1. 首先需要引用
using Microsoft.Phone.Tasks;

 

  1. 声明任务对象,需要在页面的构造函数之前声明
CameraCaptureTask cameraCaptureTask;

 

在构造函数中实例化CameraCaptureTask对象,并且注册回调方法。

cameraCaptureTask = new CameraCaptureTask();
cameraCaptureTask.Completed += new EventHandler<PhotoResult>(cameraCaptureTask_Completed);

 

在应用程序中的所需位置添加以下代码,例如按键点击事件中

cameraCaptureTask.Show();

 

在页面中添加已完成事件处理程序的代码。此代码在用户完成任务后运行。结果是一个 PhotoResult对象,该对象公开包含图像数据的流。

void cameraCaptureTask_Completed(object sender, PhotoResult e)
{
    if (e.TaskResult == TaskResult.OK)
    {
        MessageBox.Show(e.ChosenPhoto.Length.ToString());

//Code to display the photo on the page in an image control named myImage.
        //System.Windows.Media.Imaging.BitmapImage bmp = new System.Windows.Media.Imaging.BitmapImage();
        //bmp.SetSource(e.ChosenPhoto);
        //myImage.Source = bmp;
    }
}

 

这部分比较简单,就不多讲了,给个demo吧:http://pan.baidu.com/s/1pJ0Polt

 

. PhotoCamera

  PhotoCamera是在windows phone os 7.1开始加入的,在使用之前需要给应用添加访问相机的权限,在

WMAppManifest.xml中添加ID_CAP_ISV_CAMERA

 

  1. 创建UI

在创建取景器时,一般会使用VideoBrush,如果需要支持横竖屏的切换,则需要加入RelativeTransform,如下代码是一个典型的相机UI

<!-- 相机取景器 -->

        <Canvas x:Name="VideoCanvas">

            <Canvas.Background>

                <VideoBrush x:Name="BackgroundVideoBrush" >

                    <VideoBrush.RelativeTransform>

                        <CompositeTransform x:Name="VideoBrushTransform" CenterY="0.5" CenterX="0.5"/>

                    </VideoBrush.RelativeTransform>

                </VideoBrush>

            </Canvas.Background>

        </Canvas>

 

当然你还要考虑页面上的其他元素,比如点击取景器对焦,快门、闪光灯按钮等,这些可随个人洗好自定义。

 

  1. 实现取景器和相关相机事件。
    1. 首先实现取景器,先判断手机有没有相关的硬件设备(背部相机()或者前部相机)
if ((PhotoCamera.IsCameraTypeSupported(CameraType.Primary) == true) ||

                 (PhotoCamera.IsCameraTypeSupported(CameraType.FrontFacing) == true))

            {

                // Initialize the camera, when available.

                if (PhotoCamera.IsCameraTypeSupported(CameraType.FrontFacing))

                {

                    // Use front-facing camera if available.

                    cam = new Microsoft.Devices.PhotoCamera(CameraType.FrontFacing);

                }

                else

                {

                    // Otherwise, use standard camera on back of device.

                    cam = new Microsoft.Devices.PhotoCamera(CameraType.Primary);

                }

    //Set the VideoBrush source to the camera.

                viewfinderBrush.SetSource(cam);

            }

            else

            {

                // The camera is not supported on the device.

                this.Dispatcher.BeginInvoke(delegate()

                {

                    // Write message.

                    txtDebug.Text = "A Camera is not available on this device.";

                });

 

                // Disable UI.

                ShutterButton.IsEnabled = false;

                FlashButton.IsEnabled = false;

                AFButton.IsEnabled = false;

                ResButton.IsEnabled = false;

            }

 

  1. 在加载时也需要实现各种操作事件
// Event is fired when the PhotoCamera object has been initialized.

                cam.Initialized += new EventHandler<Microsoft.Devices.CameraOperationCompletedEventArgs>(cam_Initialized);

 

                // Event is fired when the capture sequence is complete.

                cam.CaptureCompleted += new EventHandler<CameraOperationCompletedEventArgs>(cam_CaptureCompleted);

 

                // Event is fired when the capture sequence is complete and an image is available.

                cam.CaptureImageAvailable += new EventHandler<Microsoft.Devices.ContentReadyEventArgs>(cam_CaptureImageAvailable);

 

                // Event is fired when the capture sequence is complete and a thumbnail image is available.

                cam.CaptureThumbnailAvailable += new EventHandler<ContentReadyEventArgs>(cam_CaptureThumbnailAvailable);

 

                // The event is fired when auto-focus is complete.

                cam.AutoFocusCompleted += new EventHandler<CameraOperationCompletedEventArgs>(cam_AutoFocusCompleted);

 

                // The event is fired when the viewfinder is tapped (for focus).

                viewfinderCanvas.Tap += new EventHandler<GestureEventArgs>(focus_Tapped);

 

                // The event is fired when the shutter button receives a half press.

                CameraButtons.ShutterKeyHalfPressed += OnButtonHalfPress;

 

                // The event is fired when the shutter button receives a full press.

                CameraButtons.ShutterKeyPressed += OnButtonFullPress;

 

                // The event is fired when the shutter button is released.

                CameraButtons.ShutterKeyReleased += OnButtonRelease;

 

  1. 上面加载了这么多事件,需要在离开此页面时释放:
protected override void OnNavigatingFrom(System.Windows.Navigation.NavigatingCancelEventArgs e)

        {

            if (cam != null)

            {

                // Dispose camera to minimize power consumption and to expedite shutdown.

                cam.Dispose();

 

                // Release memory, ensure garbage collection.

                cam.Initialized -= cam_Initialized;

                cam.CaptureCompleted -= cam_CaptureCompleted;

                cam.CaptureImageAvailable -= cam_CaptureImageAvailable;

                cam.CaptureThumbnailAvailable -= cam_CaptureThumbnailAvailable;

                cam.AutoFocusCompleted -= cam_AutoFocusCompleted;

                CameraButtons.ShutterKeyHalfPressed -= OnButtonHalfPress;

                CameraButtons.ShutterKeyPressed -= OnButtonFullPress;

                CameraButtons.ShutterKeyReleased -= OnButtonRelease;

            }

        }

 

上面这些事件,看看名字估计也就懂了是干啥的了,这里说明下他们的执行顺序,CaptureThumbnailAvailable >CaptureImageAvailable >CaptureCompleted

 

  1. 拍出了照片后需要保存,可以保存到相机中,使用的是SavePictureToCameraRoll方法,同时可以保存到独立存储空间中,方便以后读取(如果仅仅保存在相册中,下次读取时必须使用照片选择器让用户去选择照片)
public void cam_CaptureThumbnailAvailable(object sender, ContentReadyEventArgs e)

        {

            string fileName = savedCounter + "_th.jpg";

 

            try

            {

                // Write message to UI thread.

                Deployment.Current.Dispatcher.BeginInvoke(delegate()

                {

                    txtDebug.Text = "Captured image available, saving thumbnail.";

                });

 

                // Save thumbnail as JPEG to isolated storage.

                using (IsolatedStorageFile isStore = IsolatedStorageFile.GetUserStoreForApplication())

                {

                    using (IsolatedStorageFileStream targetStream = isStore.OpenFile(fileName, FileMode.Create, FileAccess.Write))

                    {

                        // Initialize the buffer for 4KB disk pages.

                        byte[] readBuffer = new byte[4096];

                        int bytesRead = -1;

 

                        // Copy the thumbnail to isolated storage.

                        while ((bytesRead = e.ImageStream.Read(readBuffer, 0, readBuffer.Length)) > 0)

                        {

                            targetStream.Write(readBuffer, 0, bytesRead);

                        }

                    }

                }

 

                // Write message to UI thread.

                Deployment.Current.Dispatcher.BeginInvoke(delegate()

                {

                    txtDebug.Text = "Thumbnail has been saved to isolated storage.";

 

                });

            }

            finally

            {

                // Close image stream

                e.ImageStream.Close();

            }

        }

 

保存照片有两个方法:SavePictureSavePictureToCameraRoll,前面的方法是保存到照片中心“保存的照片”中,后一种方法是保存到“本机拍照”中。

 

  1. 对于闪光灯、对焦、分辨率以及快门都有相应的方法,从上面的代码中也可以看到快门有半按、全按、释放等事件,这里不再赘述,可以从源代码中看到相关的事件。

 

这个例子的demo是微软提供的,比较详细,源码如下:http://pan.baidu.com/s/1c0rIqSK

 

参考文章:Windows Phone 的相机和照片

目录
相关文章
|
8月前
|
Unix Shell Windows
Windows PowerShell技巧:使用findstr实现类似grep的功能
显示带有线路编号**: `/N`选项将显示每条结果前面带有其在线路上出现位置编号。
1348 7
|
存储 算法 C++
【Qt应用开发】复刻经典:基于Qt实现Windows风格计算器(加减乘除、删除、归零功能全解析)
在Qt中,"栈"的概念主要体现在两个层面:一是程序设计中的数据结构——栈(Stack),二是用户界面管理中的QStackedWidget控件。下面我将分别简要介绍这两个方面:
650 4
|
人工智能 数据处理 C#
AI Dev Gallery:微软开源 Windows AI 模型本地运行工具包和示例库,助理开发者快速集成 AI 功能
微软推出的AI Dev Gallery,为Windows开发者提供开源AI工具包和示例库,支持本地运行AI模型,提升开发效率。
1095 13
|
安全 BI 数据安全/隐私保护
AD域、Windows AD域管理功能大全
Windows AD域管理功能大全,再也不用东拼西凑了!
1298 1
|
人工智能 JavaScript 网络安全
ToB项目身份认证AD集成(三完):利用ldap.js实现与windows AD对接实现用户搜索、认证、密码修改等功能 - 以及针对中文转义问题的补丁方法
本文详细介绍了如何使用 `ldapjs` 库在 Node.js 中实现与 Windows AD 的交互,包括用户搜索、身份验证、密码修改和重置等功能。通过创建 `LdapService` 类,提供了与 AD 服务器通信的完整解决方案,同时解决了中文字段在 LDAP 操作中被转义的问题。
739 1
|
Ubuntu Linux Python
如何利用wsl-Ubuntu里conda用来给Windows的PyCharm开发
如何在WSL(Windows Subsystem for Linux)的Ubuntu环境中使用conda虚拟环境来为Windows上的PyCharm开发设置Python解释器。
2877 1
|
存储 安全 程序员
Windows任务管理器开发原理与实现
Windows任务管理器开发原理与实现
|
Linux Apache C++
FFmpeg开发笔记(三十五)Windows环境给FFmpeg集成libsrt
该文介绍了如何在Windows环境下为FFmpeg集成SRT协议支持库libsrt。首先,需要安装Perl和Nasm,然后编译OpenSSL。接着,下载libsrt源码并使用CMake配置,生成VS工程并编译生成srt.dll和srt.lib。最后,将编译出的库文件和头文件按照特定目录结构放置,并更新环境变量,重新配置启用libsrt的FFmpeg并进行编译安装。该过程有助于优化直播推流的性能,减少卡顿问题。
710 2
FFmpeg开发笔记(三十五)Windows环境给FFmpeg集成libsrt
|
Linux Android开发 iOS开发
Windows平台RTSP|RTMP播放器如何实现实时录像功能
Windows平台RTSP、RTMP播放器实时录像接口设计,实际上,除了Windows平台,我们Linux、Android、iOS平台也是一样的设计,单纯的录像模块,如果做的全面,也不是一两个接口可以搞定的
540 1