天天看点

windows phone 使用相机并获取图片

使用相机需要引用如下命名空间

using Microsoft.Phone.Tasks;

 在这个案例中我们还用到了BitmapImage类,所以我们需要引用命名空间

using System.Windows.Media.Imaging;

 效果图如下

 MainPage.xaml文件在初始化的基础上添加了两个元素

<TextBlock x:Name="txtName" Text="启动相机" Grid.Row="1" ></TextBlock>

        <Image x:Name="img" Grid.Row="1" Margin="12,10,12,0" ></Image>

 代码隐藏文件

using System;

using System.Collections.Generic;

using System.Linq;

using System.Net;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Animation;

using System.Windows.Shapes;

using Microsoft.Phone.Controls;

//引用

namespace CameraShoot

{

    public partial class MainPage : PhoneApplicationPage

    {

        //相机捕获任务实例

        CameraCaptureTask cameraCT = new CameraCaptureTask();

        // 构造函数

        public MainPage()

        {

            InitializeComponent();

            //手机拍照功能完成后调用

            cameraCT.Completed += new EventHandler<PhotoResult>(cameraCT_Completed);

        }

        //重写触摸屏事件

        protected override void OnManipulationStarted(ManipulationStartedEventArgs e)

            //知识点①

            if (e.OriginalSource==txtName)

            {

                //调用相机

                cameraCT.Show();

            }

            //知识点②

            //触摸事件完成 

            e.Complete();

            //知识点③

            //不在向父元素传递

            e.Handled = true;

            //知识点④

            base.OnManipulationStarted(e);

        //完成

        void cameraCT_Completed(object sender, PhotoResult e)

            if (e.TaskResult==TaskResult.OK)

                BitmapImage bmp = new BitmapImage();

                //知识点⑤

                //获取包含文件流的和Source不同

                bmp.SetSource(e.ChosenPhoto);

                //设置图片源

                img.Source = bmp;

                txtName.Text = e.OriginalFileName;

    }

}

<a href="http://msdn.microsoft.com/en-us/library/microsoft.phone.tasks.cameracapturetask%28v=VS.92%29.aspx">CameraCaptureTask 派生自ChooserBase</a>

其中CameraCaptureTask,有两个比较实用的方法,也就是我们这里用到的

   Show; 调用相机功能

  Completed ;相机拍摄完成之后可被调用

   知识点①:该事件中的e是指,通过该事件传递过来的参数,所以我们可以从中获取一些信息,属性OriginalSource表示产生该事件的元素(在windows phone 中都称之为元素而非控件);

   知识点②:这里调用了Completed方法,加上该方法之后,系统就不会处理相应的路由事件了,这里是指重写的OnManipulationStarted事件 ;

   知识点③: e.Handled = true; 该属性设置表示该路由事件已经处理完毕,不需要在向可视化树的上一层传递;

   知识点④:调用本方法的基类方法,虽然在这里重写了基类方法,但是不可避免的在基类完成的基础性操作,重写没有完成,这样操作会出现一些错误

   知识点⑤:利用SetSource设置的源一定是Stream流,wp支持png和jpeg格式

  总结: 使用相机是直接调用CameraCaptureTask类的show方法,这样相机就打开了,直到图片生成,再调用Completed方法,在 Completed方法中获得 PhotoResult中该图片的stream 并作为位图的源,并设置image的源;当前图片的文件名也就是PhotoResult的属性OriginalFileName,得到的文件名为该图片的 完整路径

本文转自shenzhoulong  51CTO博客,原文链接:http://blog.51cto.com/shenzhoulong/829569,如需转载请自行联系原作者

继续阅读