1

Windows Phone (Windows 10 搭載の Lumia 950) 用のユニバーサル Windows アプリに取り組んでいます。スマートフォンの前面カメラを使用して写真を撮る、非常にシンプルなアプリです。

問題は、撮影中の写真がデフォルトで横向きモードになっていることです。縦向きになるように90度回転させたいと思います。MediaCapture オブジェクトを使用してカメラを初期化します。画像を回転させるために次のことを試しました:

await _mediaCapture.InitializeAsync(settings);
var videoEncodingProperties = _mediaCapture.VideoDeviceController.GetMediaStreamProperties(MediaStreamType.VideoPreview);
videoEncodingProperties.Properties.Add(new Guid("C380465D-2271-428C-9B83-ECEA3B4A85C1"), 90);
await _mediaCapture.SetEncodingPropertiesAsync(MediaStreamType.VideoPreview, videoEncodingProperties, null);

しかし、最後の行は「指定されたストリーム番号が無効です。PreviewState」という例外をスローします。これは提供された GUID に関係していると推測していますが、何時間もグーグルで検索した後、開発者がこれに使用するこの値を見つけ続けています。

画像を回転させる別の解決策を試しました:

_mediaCapture.SetPreviewRotation(VideoRotation.Clockwise90Degrees);

しかし、それは何もしません。

画像を回転させる方法はありますか?どうもありがとう!

4

2 に答える 2

1

プレビューを回転するには、アクティブなプレビューが必要です。これは、mediaCapture をキャプチャ要素にアタッチし、プレビューを開始し、最後に SetPreviewRotation で回転を設定する必要があることを意味します。そうすれば、完璧に動作するはずです。

于 2016-05-11T12:08:12.910 に答える
0

ほとんど何もうまくいかなかったので、画像を回転させるためにほとんどのアプリケーションを書き直しました。最終的に機能した私のコードの重要な部分は次のとおりです。

private async void TakePicture()
    {
        var stream = new InMemoryRandomAccessStream();

        try
        {
            await _mediaCapture.CapturePhotoToStreamAsync(ImageEncodingProperties.CreateJpeg(), stream);
            var photoOrientation = _foundFrontCam ? PhotoOrientation.Rotate90 : PhotoOrientation.Normal;
            var photoFile = await KnownFolders.PicturesLibrary.CreateFileAsync("Photo.jpeg", CreationCollisionOption.GenerateUniqueName);
            await ReencodeAndSavePhotoAsync(stream, photoOrientation, photoFile);                
            var imageBytes = await ShowPhotoOnScreenThenDeleteAsync(photoFile);
            PostToServerAsync(imageBytes);
        }
        catch (Exception ex)
        {
            new MessageDialog(ex.Message).ShowAsync();
        }
    }

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

            using (var outputStream = await photoFile.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();
            }
        }
    }

PhotoOrientation オブジェクトを作成し、画像を保存するときにそれを入力ストリームの一部として渡すとうまくいきました。

于 2015-12-06T21:02:20.797 に答える