相机功能是手机区别于PC的一大功能,在做手机应用时,如果合理的利用了拍照功能,可能会给自己的应用增色很多。使用Windows Phone的相机功能,有两种方法,一种是使用PhotoCamera类来构建自己的相机UI,另外一种是通过CameraCaptureTask选择器来实现该功能。
他们的区别是:
- PhotoCamera类允许应用控制照片属性,如 ISO、曝光补偿和手动对焦位置,应用可以对照片有更多的控制,当然也会麻烦很多。需要实现闪光灯、对焦、分辨率、快门按钮等操作。
- CameraCaptureTask拍照会调用系统的相机功能,返回一个有照片数据的返回值,同时一旦拍照,就会进入手机相册。
一. CameraCaptureTask选择器。
- 首先需要引用
using Microsoft.Phone.Tasks;
- 声明任务对象,需要在页面的构造函数之前声明
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
- 创建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>
当然你还要考虑页面上的其他元素,比如点击取景器对焦,快门、闪光灯按钮等,这些可随个人洗好自定义。
- 实现取景器和相关相机事件。
- 首先实现取景器,先判断手机有没有相关的硬件设备(背部相机(主)或者前部相机)
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; }
- 在加载时也需要实现各种操作事件
// 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;
- 上面加载了这么多事件,需要在离开此页面时释放:
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。
- 拍出了照片后需要保存,可以保存到相机中,使用的是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[]; int bytesRead = -; // Copy the thumbnail to isolated storage. while ((bytesRead = e.ImageStream.Read(readBuffer, , readBuffer.Length)) > ) { targetStream.Write(readBuffer, , 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(); } }
保存照片有两个方法:SavePicture和SavePictureToCameraRoll,前面的方法是保存到照片中心“保存的照片”中,后一种方法是保存到“本机拍照”中。
- 对于闪光灯、对焦、分辨率以及快门都有相应的方法,从上面的代码中也可以看到快门有半按、全按、释放等事件,这里不再赘述,可以从源代码中看到相关的事件。
这个例子的demo是微软提供的,比较详细,源码如下:http://pan.baidu.com/s/1c0rIqSK
参考文章:Windows Phone 的相机和照片