Windows Phone 開發——相機功能開發

  相機功能是手機區別於PC的一大功能,在作手機應用時,若是合理的利用了拍照功能,可能會給本身的應用增色不少。使用Windows Phone的相機功能,有兩種方法,一種是使用PhotoCamera類來構建本身的相機UI,另一種是經過CameraCaptureTask選擇器來實現該功能。windows

他們的區別是:app

  • PhotoCamera類容許應用控制照片屬性,如 ISO、曝光補償和手動對焦位置,應用能夠對照片有更多的控制,固然也會麻煩不少。須要實現閃光燈、對焦、分辨率、快門按鈕等操做。
  • CameraCaptureTask拍照會調用系統的相機功能,返回一個有照片數據的返回值,同時一旦拍照,就會進入手機相冊。

 

. CameraCaptureTask選擇器。ide

  1. 首先須要引用
using Microsoft.Phone.Tasks;

 

  1. 聲明任務對象,須要在頁面的構造函數以前聲明
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對象

 

  1. 建立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>

 

固然你還要考慮頁面上的其餘元素,好比點擊取景器對焦,快門、閃光燈按鈕等,這些可隨我的洗好自定義。

 

  1. 實現取景器和相關相機事件。
    1. 首先實現取景器,先判斷手機有沒有相關的硬件設備(背部相機()或者前部相機)
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;

            }

 

  1. 在加載時也須要實現各類操做事件
// 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;

 

  1. 上面加載了這麼多事件,須要在離開此頁面時釋放:
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

 

  1. 拍出了照片後須要保存,能夠保存到相機中,使用的是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[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();

            }

        }

 

保存照片有兩個方法:SavePictureSavePictureToCameraRoll,前面的方法是保存到照片中心「保存的照片」中,後一種方法是保存到「本機拍照」中。

 

  1. 對於閃光燈、對焦、分辨率以及快門都有相應的方法,從上面的代碼中也能夠看到快門有半按、全按、釋放等事件,這裏再也不贅述,能夠從源代碼中看到相關的事件。

 

這個例子的demo是微軟提供的,比較詳細,源碼以下:http://pan.baidu.com/s/1c0rIqSK

 

參考文章:Windows Phone 的相機和照片

相關文章
相關標籤/搜索