天天看點

windows phone 使用相機并擷取圖檔(3)

使用相機需要引用如下命名空間

using Microsoft.Phone.Tasks;

 在這個案例中我們還用到了BitmapImage類,是以我們需要引用命名空間

using System.Windows.Media.Imaging;

 效果圖如下

windows phone 使用相機并擷取圖檔(3)

 MainPage.xaml檔案在初始化的基礎上添加了兩個元素

<TextBlock x:Name="txtName" Text="啟動相機" Grid.Row="1" ></TextBlock>

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

 代碼隐藏檔案

windows phone 使用相機并擷取圖檔(3)
windows phone 使用相機并擷取圖檔(3)

View Code

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,得到的檔案名為該圖檔的完整路徑

windows phone 使用相機并擷取圖檔(3)

繼續閱讀