簡體   English   中英

如何在Windows Phone 8.1中使用正確的旋轉,寬高比拍攝照片? (使用MediaCapture)

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

您是否可以使用MediaCapture元素提供有關如何拍攝和保存照片的實際工作示例。 我曾嘗試在MSDN中尋找實際的解決方案,但這些解釋或代碼都沒有以簡單的方式描述過程。

我需要拍照並將其保存到我的庫(我需要為此顯示正確的預覽),但是現在它旋轉了90度而我無法調整它。 我已經嘗試設置視頻預覽的旋轉,它適用於預覽,但是當我這樣做時,寬高比全部錯誤,保存的圖像不正確。

第9頻道的例子也很糟糕。 我只需要一個簡單的實現......

我使用運行時應用程序而不是Windows Phone 8.1的Silverlight應用程序。

我遇到了同樣的問題,SetRecordRotation對我不起作用。 我找到了解決方法 - 拍照並旋轉圖像,效果很好。 我使用這樣的方法:

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 {}
            }
        } 
    }

我修改了文章如何在您的Windows Phone 8.1運行時應用程序中捕獲照片的代碼示例,作者:Marco Siccardi http://dotnet.dzone.com/articles/how-capture-photo-your-windows-0

Microsoft github頁面上發布了兩個相關的樣本,盡管它們針對Windows 10.但是,API應該適用於8 / 8.1。

GetPreviewFrame :此示例不會鎖定頁面旋轉,並將校正旋轉應用於預覽流。 它不使用SetPreviewRotation ,因為該方法比使用元數據方法更耗費資源。 此示例不捕獲照片(僅預覽幀)

UniversalCameraSample :這張照片可以拍攝照片,並支持縱向和橫向方向。 以下是相關部分:

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());
}

附:

    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();
            }
        }
    }

仔細查看示例,了解如何首先獲取攝像頭的方向(在我發布的第一個片段中調用它)。

或者,如果您更喜歡視頻,您可以觀看最近//構建/會議中的相機會話 ,其中包括一些相機樣本的演練。

您可以通過在MediaCapture.VideoDeviceController中進行設置來更改視頻預覽和捕獲的照片的寬高比

此外,您可以使用以下代碼直立設置視頻預覽。

 MediaCapture.SetPreviewRotation(VideoRotation.Clockwise90Degrees);

我在下面鏈接的另一篇文章中回答了類似的問題。 希望能幫助到你。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM