/// <summary>
        /// Gets the file extension string.
        /// </summary>
        /// <param name="format">The selected format.</param>
        /// <returns>This string represent a file extension.</returns>
        private string GetFormatExtension(PhotoCaptureFormat format)
        {
            switch (format)
            {
            case PhotoCaptureFormat.JPG:
                return(".jpg");

            case PhotoCaptureFormat.BMP:
                return(".bmp");

            case PhotoCaptureFormat.PNG:
            default:
                return(".png");
            }
        }
        /// <summary>
        /// Gets the Image encondings properties.
        /// </summary>
        /// <param name="format">The selected format.</param>
        /// <returns>The properties of the selected format.</returns>
        private ImageEncodingProperties GetImageEncodingProperties(PhotoCaptureFormat format)
        {
            switch (format)
            {
            case PhotoCaptureFormat.JPG:
                return(ImageEncodingProperties.CreateJpeg());

            case PhotoCaptureFormat.BMP:
                return(ImageEncodingProperties.CreateBmp());

            case PhotoCaptureFormat.PNG:
            default:
                return(ImageEncodingProperties.CreatePng());
            }
        }
 /// <summary>
 /// Gets the file extension string.
 /// </summary>
 /// <param name="format">The selected format.</param>
 /// <returns>This string represent a file extension.</returns>
 private string GetFormatExtension(PhotoCaptureFormat format)
 {
     switch (format)
     {
         case PhotoCaptureFormat.JPG:
             return ".jpg";
         case PhotoCaptureFormat.BMP:
             return ".bmp";
         case PhotoCaptureFormat.PNG:
         default:
             return ".png";
     }
 }
 /// <summary>
 /// Gets the Image encondings properties.
 /// </summary>
 /// <param name="format">The selected format.</param>
 /// <returns>The properties of the selected format.</returns>
 private ImageEncodingProperties GetImageEncodingProperties(PhotoCaptureFormat format)
 {
     switch (format)
     {
         case PhotoCaptureFormat.JPG:
             return ImageEncodingProperties.CreateJpeg();
         case PhotoCaptureFormat.BMP:
             return ImageEncodingProperties.CreateBmp();
         case PhotoCaptureFormat.PNG:
         default:
             return ImageEncodingProperties.CreatePng();
     }
 }
        /// <summary>
        /// Take a new photo.
        /// </summary>
        /// <param name="filename">The output file name.</param>
        /// <param name="parameters">The set of parameters used to take the photo, <see cref="ICameraResolution"/> class.</param>
        /// <param name="format">The image format. <see cref="PhotoCaptureFormat"/> enum. </param>
        /// <returns>The <see cref="VideoCaptureResult"/> struct.</returns>
        public async Task<PhotoCaptureResult> TakePhotoAsync(string filename, ICameraResolution parameters, PhotoCaptureFormat format)
        {
            if (string.IsNullOrEmpty(filename))
            {
                throw new ArgumentException("The filename cannot be empty or null.");
            }

            if (!this.isInitialized)
            {
                Debug.WriteLine("First you need to initialize the videocapturemanager.");
                return new PhotoCaptureResult();
            }

            try
            {
                if (parameters != null)
                {
                    Debug.WriteLine("Applying paramenters...");
                    await this.mediaCapture.VideoDeviceController.SetMediaStreamPropertiesAsync(MediaStreamType.Photo, (parameters as StreamResolution).EncodingProperties);
                }

                Debug.WriteLine("Taking photo...");
                var properties = this.GetImageEncodingProperties(format);
                var name = filename + this.GetFormatExtension(format);
                var file = await this.captureFolder.CreateFileAsync(name, CreationCollisionOption.GenerateUniqueName);

                Debug.WriteLine("Photo taken! Saving to " + file.Path);
                await this.mediaCapture.CapturePhotoToStorageFileAsync(properties, file);

                Debug.WriteLine("Photo saved.");
                return new PhotoCaptureResult(true, file.Path);
            }
            catch (Exception ex)
            {
                Debug.WriteLine("Exception when taking a photo: " + ex.ToString());
                return new PhotoCaptureResult(false, string.Empty);
            }
        }
        /// <summary>
        /// Take a new photo and hold it in the output stream.
        /// </summary>
        /// <param name="parameters">The set of parameters used to take the photo, <see cref="ICameraResolution"/> class.</param>
        /// <param name="format">The image format. <see cref="PhotoCaptureFormat"/> enum. </param>
        /// <returns>The <see cref="PhotoCaptureStreamResult"/> struct.</returns>
        public async Task<PhotoCaptureStreamResult> TakePhotoToStreamAsync(ICameraResolution parameters, PhotoCaptureFormat format)
        {
            if (!this.isInitialized)
            {
                Debug.WriteLine("First you need to initialize the videocapturemanager.");
                return new PhotoCaptureStreamResult();
            }

            try
            {
                if (parameters != null)
                {
                    Debug.WriteLine("Applying paramenters...");
                    await this.mediaCapture.VideoDeviceController.SetMediaStreamPropertiesAsync(MediaStreamType.Photo, (parameters as StreamResolution).EncodingProperties);
                }

                Debug.WriteLine("Taking photo...");
                var stream = new InMemoryRandomAccessStream();

                var properties = this.GetImageEncodingProperties(format);
                await this.mediaCapture.CapturePhotoToStreamAsync(properties, stream);

                Debug.WriteLine("Photo stream loaded.");
                return new PhotoCaptureStreamResult(true, stream.AsStream());
            }
            catch (Exception ex)
            {
                Debug.WriteLine("Exception when taking a photo: " + ex.ToString());
                return new PhotoCaptureStreamResult(false, Stream.Null);
            }
        }
        /// <summary>
        /// Take a new photo.
        /// </summary>
        /// <param name="filename">The output file name.</param>
        /// <param name="parameters">The set of parameters used to take the photo, <see cref="ICameraResolution"/> class.</param>
        /// <param name="format">The image format. <see cref="PhotoCaptureFormat"/> enum. </param>
        /// <returns>The <see cref="VideoCaptureResult"/> struct.</returns>
        public async Task <PhotoCaptureResult> TakePhotoAsync(string filename, ICameraResolution parameters = null, PhotoCaptureFormat format = PhotoCaptureFormat.JPG)
        {
            PhotoCaptureResult result = default(PhotoCaptureResult);

            if (this.videoCaptureManager != null)
            {
                result = await this.videoCaptureManager.TakePhotoAsync(filename, parameters, format);
            }

            return(result);
        }
        /// <summary>
        /// Take a new photo and hold it in the output stream.
        /// </summary>
        /// <param name="parameters">The set of parameters used to take the photo, <see cref="ICameraResolution"/> class.</param>
        /// <param name="format">The image format. <see cref="PhotoCaptureFormat"/> enum. </param>
        /// <returns>The <see cref="PhotoCaptureStreamResult"/> struct.</returns>
        public async Task <PhotoCaptureStreamResult> TakePhotoInStreamAsync(ICameraResolution parameters = null, PhotoCaptureFormat format = PhotoCaptureFormat.JPG)
        {
            PhotoCaptureStreamResult result = default(PhotoCaptureStreamResult);

            if (this.videoCaptureManager != null)
            {
                result = await this.videoCaptureManager.TakePhotoToStreamAsync(parameters, format);
            }

            return(result);
        }
        /// <summary>
        /// Take a new photo.
        /// </summary>
        /// <param name="filename">The output file name.</param>
        /// <param name="parameters">The set of parameters used to take the photo, <see cref="ICameraResolution"/> class.</param>
        /// <param name="format">The image format. <see cref="PhotoCaptureFormat"/> enum. </param>
        /// <returns>The <see cref="VideoCaptureResult"/> struct.</returns>
        public async Task <PhotoCaptureResult> TakePhotoAsync(string filename, ICameraResolution parameters, PhotoCaptureFormat format)
        {
            if (string.IsNullOrEmpty(filename))
            {
                throw new ArgumentException("The filename cannot be empty or null.");
            }

            if (!this.isInitialized)
            {
                Debug.WriteLine("First you need to initialize the videocapturemanager.");
                return(new PhotoCaptureResult());
            }

            try
            {
                if (parameters != null)
                {
                    Debug.WriteLine("Applying paramenters...");
                    await this.mediaCapture.VideoDeviceController.SetMediaStreamPropertiesAsync(MediaStreamType.Photo, (parameters as StreamResolution).EncodingProperties);
                }

                Debug.WriteLine("Taking photo...");
                var properties = this.GetImageEncodingProperties(format);
                var name       = filename + this.GetFormatExtension(format);
                var file       = await this.captureFolder.CreateFileAsync(name, CreationCollisionOption.GenerateUniqueName);

                Debug.WriteLine("Photo taken! Saving to " + file.Path);
                await this.mediaCapture.CapturePhotoToStorageFileAsync(properties, file);

                Debug.WriteLine("Photo saved.");
                return(new PhotoCaptureResult(true, file.Path));
            }
            catch (Exception ex)
            {
                Debug.WriteLine("Exception when taking a photo: " + ex.ToString());
                return(new PhotoCaptureResult(false, string.Empty));
            }
        }
        /// <summary>
        /// Take a new photo and hold it in the output stream.
        /// </summary>
        /// <param name="parameters">The set of parameters used to take the photo, <see cref="ICameraResolution"/> class.</param>
        /// <param name="format">The image format. <see cref="PhotoCaptureFormat"/> enum. </param>
        /// <returns>The <see cref="PhotoCaptureStreamResult"/> struct.</returns>
        public async Task <PhotoCaptureStreamResult> TakePhotoToStreamAsync(ICameraResolution parameters, PhotoCaptureFormat format)
        {
            if (!this.isInitialized)
            {
                Debug.WriteLine("First you need to initialize the videocapturemanager.");
                return(new PhotoCaptureStreamResult());
            }

            try
            {
                if (parameters != null)
                {
                    Debug.WriteLine("Applying paramenters...");
                    await this.mediaCapture.VideoDeviceController.SetMediaStreamPropertiesAsync(MediaStreamType.Photo, (parameters as StreamResolution).EncodingProperties);
                }

                Debug.WriteLine("Taking photo...");
                var stream = new InMemoryRandomAccessStream();

                var properties = this.GetImageEncodingProperties(format);
                await this.mediaCapture.CapturePhotoToStreamAsync(properties, stream);

                Debug.WriteLine("Photo stream loaded.");
                return(new PhotoCaptureStreamResult(true, stream.AsStream()));
            }
            catch (Exception ex)
            {
                Debug.WriteLine("Exception when taking a photo: " + ex.ToString());
                return(new PhotoCaptureStreamResult(false, Stream.Null));
            }
        }