Windows Phone 8.1 媒体捕获旋转不正确

Windows Phone 8.1 Media Capture Rotated Incorrectly

我很难正确旋转捕获的图像,位图编码器 class 似乎没有做任何事情。

    private async Task CapturePhoto()
    {
        ImageEncodingProperties pIEPEncoder = ImageEncodingProperties.CreateJpeg();
        InMemoryRandomAccessStream pIMSCapture = new InMemoryRandomAccessStream();
        using (pIMSCapture)
        {
            await cMCeCapture.CapturePhotoToStreamAsync(pIEPEncoder, pIMSCapture);

            pIMSCapture.Seek(0);

            BitmapDecoder pBDrDecoder = await BitmapDecoder.CreateAsync(pIMSCapture);
            BitmapEncoder pBErEncoder = await BitmapEncoder.CreateForTranscodingAsync(pIMSCapture, pBDrDecoder);
            pBErEncoder.BitmapTransform.InterpolationMode = BitmapInterpolationMode.Fant;
            pBErEncoder.BitmapTransform.Rotation = ConvertDegreesToBitmapRotation(cIntRotationDegrees);
            await pBErEncoder.FlushAsync();

            BitmapImage pBIeCapture = new BitmapImage();
            pIMSCapture.Seek(0);
            await pBIeCapture.SetSourceAsync(pIMSCapture);

            CaptureImage.Source = pBIeCapture;
            CaptureImage.Stretch = Stretch.Uniform;
            CaptureImage.Width = LayoutRoot.ActualWidth;
            CaptureImage.Height = LayoutRoot.ActualHeight;
        }

        await CleanupCameraAsync();
    }

有什么解决办法吗?相机 API 最近似乎是我的克星,让任何东西按我想要的方式工作真是令人沮丧。

我找到了另一种解决方案,那就是使用从这里获得的 WritableBitmapEx class,

https://writeablebitmapex.codeplex.com/

这实际上做了它应该做的事情,与 BitmapEncoder class 出于某种原因不同。此外,它非常易于使用。虽然翻转水平似乎翻转垂直,但不完全确定为什么,但它仍然有效。我刚换了水平和垂直。

    private async Task CapturePhoto()
    {
        ImageEncodingProperties pIEPEncoder = ImageEncodingProperties.CreateJpeg();
        InMemoryRandomAccessStream pIMSCapture = new InMemoryRandomAccessStream();
        using (pIMSCapture)
        {
            await cMCeCapture.CapturePhotoToStreamAsync(pIEPEncoder, pIMSCapture);

            if(!cBlnExternalCamera)
            {
                pIMSCapture.Seek(0);
                BitmapImage pBIeCapture = new BitmapImage();
                await pBIeCapture.SetSourceAsync(pIMSCapture);

                pIMSCapture.Seek(0);
                WriteableBitmap pWBpBitmap = new WriteableBitmap(pBIeCapture.PixelWidth, pBIeCapture.PixelHeight);
                await pWBpBitmap.SetSourceAsync(pIMSCapture);

                if (cIntRotationDegrees != 0)
                    pWBpBitmap = pWBpBitmap.Rotate(cIntRotationDegrees);

                if (cBlnMirroringPreview)
                    pWBpBitmap = pWBpBitmap.Flip(cDInDisplayInformation.CurrentOrientation == DisplayOrientations.Landscape || cDInDisplayInformation.CurrentOrientation == DisplayOrientations.LandscapeFlipped ? WriteableBitmapExtensions.FlipMode.Vertical : WriteableBitmapExtensions.FlipMode.Horizontal);

                CaptureImage.Source = pWBpBitmap;
                CaptureImage.Stretch = Stretch.Uniform;
                CaptureImage.Width = LayoutRoot.ActualWidth;
                CaptureImage.Height = LayoutRoot.ActualHeight;
            }
            else
            {
                pIMSCapture.Seek(0);
                BitmapImage pBIeCapture = new BitmapImage();
                await pBIeCapture.SetSourceAsync(pIMSCapture);

                CaptureImage.Source = pBIeCapture;
                CaptureImage.Stretch = Stretch.Uniform;
                CaptureImage.Width = LayoutRoot.ActualWidth;
                CaptureImage.Height = LayoutRoot.ActualHeight;
            }
        }

        await CleanupCameraAsync();
    }