相機功能是手機區別於PC的一大功能,在作手機應用時,若是合理的利用了拍照功能,可能會給本身的應用增色不少。使用Windows Phone的相機功能,有兩種方法,一種是使用PhotoCamera類來構建本身的相機UI,另一種是經過CameraCaptureTask選擇器來實現該功能。windows
他們的區別是:app
一. CameraCaptureTask選擇器。ide
using Microsoft.Phone.Tasks;
CameraCaptureTask cameraCaptureTask;
在構造函數中實例化CameraCaptureTask對象,而且註冊回調方法。函數
cameraCaptureTask = new CameraCaptureTask(); cameraCaptureTask.Completed += new EventHandler<PhotoResult>(cameraCaptureTask_Completed);
在應用程序中的所需位置添加如下代碼,例如按鍵點擊事件中this
cameraCaptureTask.Show();
在頁面中添加已完成事件處理程序的代碼。此代碼在用戶完成任務後運行。結果是一個 PhotoResult對象,該對象公開包含圖像數據的流。spa
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/1pJ0Poltcode
二. PhotoCameraorm
PhotoCamera是在windows phone os 7.1開始加入的,在使用以前須要給應用添加訪問相機的權限,在xml
WMAppManifest.xml中添加ID_CAP_ISV_CAMERA對象
在建立取景器時,通常會使用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。
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(); } }
保存照片有兩個方法:SavePicture和SavePictureToCameraRoll,前面的方法是保存到照片中心「保存的照片」中,後一種方法是保存到「本機拍照」中。
這個例子的demo是微軟提供的,比較詳細,源碼以下:http://pan.baidu.com/s/1c0rIqSK
參考文章:Windows Phone 的相機和照片