简体   繁体   中英

How do i take a photo with the correct rotation, aspect ratio in Windows Phone 8.1? (using MediaCapture)

Can any of you provide an actual working sample of how to take and save a photo using the MediaCapture element. I've tried looking for an actual solution in MSDN but none of those explanations or code actually describe the process in a simple way.

I need to take a picture and save it to my library (i need to show the correct preview for this), however right now it is rotated 90 degrees and i can't adjust it. I've tried setting the rotation of the video preview and it works for the preview however when i do this the aspect ratio its all wrong and the saved image its not correct.

The examples from channel 9 kind of suck too. I just need a simple implementation...

Im using a Runtime app NOT a silverlight app for Windows Phone 8.1.

I have had the same issue, SetRecordRotation doesn't work for me. I found workaround - take photo and rotate an image, it works great. I use method like that:

private async void CapturePhoto()
    {
        string photoPath = string.Empty;
        ImageEncodingProperties format = ImageEncodingProperties.CreateJpeg();

        using (var imageStream = new InMemoryRandomAccessStream())
        {
            await MediaCapture.CapturePhotoToStreamAsync(format, imageStream);

            BitmapDecoder dec = await BitmapDecoder.CreateAsync(imageStream);
            BitmapEncoder enc = await BitmapEncoder.CreateForTranscodingAsync(imageStream, dec);

            enc.BitmapTransform.Rotation = BitmapRotation.Clockwise90Degrees;

            await enc.FlushAsync();

            StorageFolder folder = ApplicationData.Current.LocalFolder;
            StorageFile capturefile = await folder.CreateFileAsync("photo.jpg", CreationCollisionOption.GenerateUniqueName);
            photoPath = capturefile.Name;

            using (var fileStream = await capturefile.OpenAsync(FileAccessMode.ReadWrite))
            {
                try
                {  
                    await RandomAccessStream.CopyAsync(imageStream, fileStream);
                }
                catch {}
            }
        } 
    }

I modified sample of code from article How to capture a photo in your Windows Phone 8.1 Runtime app by Marco Siccardi http://dotnet.dzone.com/articles/how-capture-photo-your-windows-0

There are two samples posted on the Microsoft github page that are relevant, although they target Windows 10. Still, the APIs should work on 8/8.1.

GetPreviewFrame : This sample will not lock the page rotation, and apply a corrective rotation to the preview stream. It does not use SetPreviewRotation , as that method is more resource-heavy than using the metadata approach. This sample doesn't capture photos (just preview frames)

UniversalCameraSample : This one does capture photos, and supports portrait and landscape orientations. Here is the relevant part:

var stream = new InMemoryRandomAccessStream();

try
{
    await _mediaCapture.CapturePhotoToStreamAsync(ImageEncodingProperties.CreateJpeg(), stream);

    var photoOrientation = ConvertOrientationToPhotoOrientation(GetCameraOrientation());

    await ReencodeAndSavePhotoAsync(stream, photoOrientation);
}
catch (Exception ex)
{
    Debug.WriteLine("Exception when taking a photo: {0}", ex.ToString());
}

With:

    private static async Task ReencodeAndSavePhotoAsync(IRandomAccessStream stream, PhotoOrientation photoOrientation)
    {
        using (var inputStream = stream)
        {
            var decoder = await BitmapDecoder.CreateAsync(inputStream);

            var file = await KnownFolders.PicturesLibrary.CreateFileAsync("SimplePhoto.jpeg", CreationCollisionOption.GenerateUniqueName);

            using (var outputStream = await file.OpenAsync(FileAccessMode.ReadWrite))
            {
                var encoder = await BitmapEncoder.CreateForTranscodingAsync(outputStream, decoder);

                var properties = new BitmapPropertySet { { "System.Photo.Orientation", new BitmapTypedValue(photoOrientation, PropertyType.UInt16) } };

                await encoder.BitmapProperties.SetPropertiesAsync(properties);
                await encoder.FlushAsync();
            }
        }
    }

Have a closer look at the sample to see how to get the orientation of the camera in the first place (a call to it is being made in the first snippet I posted).

Or, if you prefer a video, you can watch the camera session from the recent //build/ conference, which includes a little bit of a walkthrough through some camera samples.

you can change the aspect ratio for your video preview & captured photo by setting in the MediaCapture.VideoDeviceController .

Also, you can set your video preview upright by using the following code.

 MediaCapture.SetPreviewRotation(VideoRotation.Clockwise90Degrees);

I have answered a similar questions in the another post in the link below. Hope it helps.

https://stackoverflow.com/a/29875992/4672579

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM