123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341 |
- 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;
- using Microsoft.Devices;
- using System.IO;
- using System.IO.IsolatedStorage;
- using Microsoft.Xna.Framework.Media;
- namespace CameraApp.Views
- {
-
- public partial class MainView : PhoneApplicationPage
- {
- // Variables
- private int savedCounter = 0;
- PhotoCamera cam;
- MediaLibrary library = new MediaLibrary();
- public MainView()
- {
- InitializeComponent();
- }
- //Code for initialization, capture completed, image availability events; also setting the source for the viewfinder.
- protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
- {
- // Check to see if the camera is available on the device.
- 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);
- }
- // 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);
- //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;
- }
- }
- 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;
- }
- }
- // Update the UI if initialization succeeds.
- void cam_Initialized(object sender, Microsoft.Devices.CameraOperationCompletedEventArgs e)
- {
- if (e.Succeeded)
- {
- this.Dispatcher.BeginInvoke(delegate()
- {
- // Write message.
- txtDebug.Text = "Camera initialized.";
- });
- }
- }
- // Ensure that the viewfinder is upright in LandscapeRight.
- protected override void OnOrientationChanged(OrientationChangedEventArgs e)
- {
- if (cam != null)
- {
- // LandscapeRight rotation when camera is on back of device.
- int landscapeRightRotation = 180;
- // Change LandscapeRight rotation for front-facing camera.
- if (cam.CameraType == CameraType.FrontFacing) landscapeRightRotation = -180;
- // Rotate video brush from camera.
- if (e.Orientation == PageOrientation.LandscapeRight)
- {
- // Rotate for LandscapeRight orientation.
- viewfinderBrush.RelativeTransform =
- new CompositeTransform() { CenterX = 0.5, CenterY = 0.5, Rotation = landscapeRightRotation };
- }
- else
- {
- // Rotate for standard landscape orientation.
- viewfinderBrush.RelativeTransform =
- new CompositeTransform() { CenterX = 0.5, CenterY = 0.5, Rotation = 0 };
- }
- }
- base.OnOrientationChanged(e);
- }
- private void ShutterButton_Click(object sender, RoutedEventArgs e)
- {
- }
- void cam_CaptureCompleted(object sender, CameraOperationCompletedEventArgs e)
- {
- // Increments the savedCounter variable used for generating JPEG file names.
- savedCounter++;
- }
- //isolated storage
- // Informs when full resolution picture has been taken, saves to local media library and isolated storage.
- void cam_CaptureImageAvailable(object sender, Microsoft.Devices.ContentReadyEventArgs e)
- {
- string fileName = savedCounter + ".jpg";
- try
- { // Write message to the UI thread.
- Deployment.Current.Dispatcher.BeginInvoke(delegate()
- {
- txtDebug.Text = "Captured image available, saving picture.";
- });
- // Save picture to the library camera roll.
- library.SavePictureToCameraRoll(fileName, e.ImageStream);
- // Write message to the UI thread.
- Deployment.Current.Dispatcher.BeginInvoke(delegate()
- {
- txtDebug.Text = "Picture has been saved to camera roll.";
- });
- // Set the position of the stream back to start
- e.ImageStream.Seek(0, SeekOrigin.Begin);
- // Save picture 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 image to isolated storage.
- while ((bytesRead = e.ImageStream.Read(readBuffer, 0, readBuffer.Length)) > 0)
- {
- targetStream.Write(readBuffer, 0, bytesRead);
- }
- }
- }
- // Write message to the UI thread.
- Deployment.Current.Dispatcher.BeginInvoke(delegate()
- {
- txtDebug.Text = "Picture has been saved to isolated storage.";
- });
- }
- finally
- {
- // Close image stream
- e.ImageStream.Close();
- }
- }
- // Informs when thumbnail picture has been taken, saves to isolated storage
- // User will select this image in the pictures application to bring up the full-resolution picture.
- 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();
- }
- }
- private void ApplicationBarIconButton_Click(object sender, EventArgs e)
- {
- if (cam != null)
- {
- try
- {
- // Start image capture.
- cam.CaptureImage();
- }
- catch (Exception ex)
- {
- this.Dispatcher.BeginInvoke(delegate()
- {
- // Cannot capture an image until the previous capture has completed.
- txtDebug.Text = ex.Message;
- });
- }
- }
- }
- Point origPoint;
- Rectangle rect;
- void draw_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
- {
- viewfinderCanvas.Children.Clear();
- rect = new Rectangle();
- origPoint = e.GetPosition(viewfinderCanvas);
- Canvas.SetLeft(rect, origPoint.X);
- Canvas.SetTop(rect, origPoint.Y);
- rect.Stroke = new SolidColorBrush(Colors.Black);
- rect.StrokeThickness = 2;
- viewfinderCanvas.Children.Add(rect);
- viewfinderCanvas.MouseMove += draw_MouseMove;
- viewfinderCanvas.MouseLeftButtonUp += draw_MouseLeftButtonUp;
- }
- void draw_MouseMove(object sender, MouseEventArgs e)
- {
- if (rect != null)
- {
- Point curPoint = e.GetPosition(viewfinderCanvas);
- if (curPoint.X > origPoint.X)
- {
- rect.Width = curPoint.X - origPoint.X;
- }
- else if (curPoint.X < origPoint.X)
- {
- Canvas.SetLeft(rect, curPoint.X);
- rect.Width = origPoint.X - curPoint.X;
- }
- if (curPoint.Y > origPoint.Y)
- {
- rect.Height = curPoint.Y - origPoint.Y;
- }
- else if (curPoint.Y < origPoint.Y)
- {
- Canvas.SetTop(rect, curPoint.Y);
- rect.Height = origPoint.Y - curPoint.Y;
- }
- }
- }
- void draw_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
- {
- if (rect != null)
- {
- viewfinderCanvas.MouseMove -= draw_MouseMove;
- viewfinderCanvas.MouseLeftButtonUp -= draw_MouseLeftButtonUp;
- rect = null;
- }
- }
- }
- }
|