void UpdateButtonOrientation() { // Rotate the UI app bar button to match the rotation of the device var angle = CameraRotationHelper.ConvertSimpleOrientationToClockwiseDegrees(_rotationHelper.GetUIOrientation()); var transform = new RotateTransform { Angle = angle }; _takePhotoButton.RenderTransform = transform; }
async Task InitializeCameraAsync() { if (_mediaCapture == null) { // Attempt to get the back camera if one is available, but use any camera device if not var cameraDevice = await FindCameraDeviceByPanelAsync(Windows.Devices.Enumeration.Panel.Back); if (cameraDevice == null) { Debug.WriteLine("No camera device found."); return; } _mediaCapture = new MediaCapture(); var settings = new MediaCaptureInitializationSettings { VideoDeviceId = cameraDevice.Id }; try { await _mediaCapture.InitializeAsync(settings); _isInitialized = true; } catch (UnauthorizedAccessException) { Debug.WriteLine("The app was denied access to the camera."); } // If initialization succeeded, start the preview if (_isInitialized) { // Figure out where the camera is located if (cameraDevice.EnclosureLocation == null || cameraDevice.EnclosureLocation.Panel == Windows.Devices.Enumeration.Panel.Unknown) { // No information on the location of the camera, assume it's an external camera, not integrated on the device _externalCamera = true; } else { // Camera is fixed on the device _externalCamera = false; // Only mirror the preview if the camera is on the front panel _mirroringPreview = (cameraDevice.EnclosureLocation.Panel == Windows.Devices.Enumeration.Panel.Front); } _rotationHelper = new CameraRotationHelper(cameraDevice.EnclosureLocation); _rotationHelper.OrientationChanged += OnOrientationChanged; await StartPreviewAsync(); } } }
async Task SetPreviewRotationAsync() { // Only update the orientation if the camera is mounted on the device if (_externalCamera) { return; } // Add rotation metadata to the preview stream to ensure aspect ratio/dimensions match when rendering and getting preview frames var orientation = _rotationHelper.GetCameraPreviewOrientation(); var properties = _mediaCapture.VideoDeviceController.GetMediaStreamProperties(MediaStreamType.VideoPreview); properties.Properties.Add(RotationKey, CameraRotationHelper.ConvertSimpleOrientationToClockwiseDegrees(orientation)); await _mediaCapture.SetEncodingPropertiesAsync(MediaStreamType.VideoPreview, properties, null); }
async Task TakePhotoAsync() { var stream = new InMemoryRandomAccessStream(); await _mediaCapture.CapturePhotoToStreamAsync(ImageEncodingProperties.CreateJpeg(), stream); try { var file = await _captureFolder.CreateFileAsync("Photo.jpg", CreationCollisionOption.GenerateUniqueName); var orientation = CameraRotationHelper.ConvertSimpleOrientationToPhotoOrientation(_rotationHelper.GetCameraCaptureOrientation()); await ReencodeAndSavePhotoAsync(stream, file, orientation); Debug.WriteLine("Photo saved to " + file.Path); } catch (Exception ex) { Debug.WriteLine("Exception when taking photo: " + ex.ToString()); } }
async Task CleanupCameraAsync() { if (_isInitialized) { if (_isPreviewing) { await StopPreviewAsync(); } _isInitialized = false; } if (_mediaCapture != null) { _mediaCapture.Dispose(); _mediaCapture = null; } if (_rotationHelper != null) { _rotationHelper.OrientationChanged -= OnOrientationChanged; _rotationHelper = null; } }