windows phone 使用相机并获取图片(3)
在这个案例中我们还用到了BitmapImage类,所以我们需要引用命名空间
效果图如下
MainPage.xaml文件在初始化的基础上添加了两个元素
<Image x:Name="img" Grid.Row="1" Margin="12,10,12,0" ></Image>
代码隐藏文件
1 View Code using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Net; 5 using System.Windows; 6 using System.Windows.Controls; 7 using System.Windows.Documents; 8 using System.Windows.Input; 9 using System.Windows.Media; 10 using System.Windows.Media.Animation; 11 using System.Windows.Shapes; 12 using Microsoft.Phone.Controls; 13 //引用 14 using System.Windows.Media.Imaging; 15 using Microsoft.Phone.Tasks; 16 17 namespace CameraShoot 18 { 19 public partial class MainPage : PhoneApplicationPage 20 { 21 //相机捕获任务实例 22 CameraCaptureTask cameraCT = new CameraCaptureTask(); 23 // 构造函数 24 public MainPage() 25 { 26 InitializeComponent(); 27 //手机拍照功能完成后调用 28 cameraCT.Completed += new EventHandler<PhotoResult>(cameraCT_Completed); 29 } 30 //重写触摸屏事件 31 protected override void OnManipulationStarted(ManipulationStartedEventArgs e) 32 { 33 //知识点① 34 if (e.OriginalSource==txtName) 35 { 36 //调用相机 37 cameraCT.Show(); 38 } 39 //知识点② 40 //触摸事件完成 41 e.Complete(); 42 //知识点③ 43 //不在向父元素传递 44 e.Handled = true; 45 //知识点④ 46 base.OnManipulationStarted(e); 47 } 48 //完成 49 void cameraCT_Completed(object sender, PhotoResult e) 50 { 51 if (e.TaskResult==TaskResult.OK) 52 { 53 BitmapImage bmp = new BitmapImage(); 54 //知识点⑤ 55 //获取包含文件流的和Source不同 56 bmp.SetSource(e.ChosenPhoto); 57 //设置图片源 58 img.Source = bmp; 59 txtName.Text = e.OriginalFileName; 60 } 61 } 62 } 63 }
其中CameraCaptureTask,有两个比较实用的方法,也就是我们这里用到的
Show; 调用相机功能
Completed ;相机拍摄完成之后可被调用
知识点①:该事件中的e是指,通过该事件传递过来的参数,所以我们可以从中获取一些信息,属性OriginalSource表示产生该事件的元素(在windows phone 中都称之为元素而非控件);
知识点②:这里调用了Completed方法,加上该方法之后,系统就不会处理相应的路由事件了,这里是指重写的OnManipulationStarted事件 ;
知识点③: e.Handled = true; 该属性设置表示该路由事件已经处理完毕,不需要在向可视化树的上一层传递;
知识点④:调用本方法的基类方法,虽然在这里重写了基类方法,但是不可避免的在基类完成的基础性操作,重写没有完成,这样操作会出现一些错误
知识点⑤:利用SetSource设置的源一定是Stream流,wp支持png和jpeg格式
这些都是在模拟器上的的操作,如果在真机上测试,请在测试前关闭ZUNE,也可移步http://www.cnblogs.com/fwind/archive/2011/11/28/2265890.html
总结:使用相机是直接调用CameraCaptureTask类的show方法,这样相机就打开了,直到图片生成,再调用Completed方法,在Completed方法中获得 PhotoResult中该图片的stream 并作为位图的源,并设置image的源;当前图片的文件名也就是PhotoResult的属性OriginalFileName,得到的文件名为该图片的完整路径