2017-05-28 6 views
0

更新:質問については、カメラSurfaceTextureでレンダリングするときに、カメラからフレームを回転させるのは誰ですか?

SurfaceTextureにカメラのプレビューを描画したときに誰が回転変換を適用するかを調べようとしています。

カメラからのプレビューサイズを要求する場合(撮影時景観が通常の向きであるため)高さよりも大きくなっているところは、常にペアを取得します。

このデバイスをポートレートモードで使用し、プレビューサイズ(例:1600 x1200)を設定すると、カメラからのフレームは正しく回転しますが、完了した場所はわかりませんが、CameraDeviceは自動的に表面タイプ?または画像を回転させるのはSurfaceTextureですか?

答えて

1

答えは、使用しているカメラAPIのビットによって異なります。あなたはCameraDeviceについて言及しているので、私はあなたがカメラ2を意味すると仮定します。

カメラ2では、可能な場合はローテーション処理を簡略化することが目標の1つでした。サーフェスビューにプレビューを描画すると、カメラサービスとハードウェアコンポジット/ GPUが連携し、すべてのローテーションを処理します。センサーの横長解像度(デバイスの長辺に合わせて長辺に合わせる)を常に要求し、SurfaceViewのアスペクト比と要求された解像度のアスペクト比が一致するようにする必要があります(ポートレート、あなたは1080pを正しく表示するには9:16ビューが必要です;ランドスケープでは16:9ビューが必要です)。

TextureViewの場合、SurfaceTextureを使用した完全なカスタムGL描画の場合、APIですべてを処理することはできません。 SurfaceTextureの変換は、カメラの出力をデバイスのネイティブな向き(一般的に携帯電話の場合はポートレート、一部のタブレットの場合は風景)に回転するようにカメラAPIによって設定されますが、アプリのUIがネイティブの向きでない場合。

この場合、SurfaceTexureから変換マトリックスを取得し、余分な回転をアプリのUIに合わせて適用し、それをTextureViewマトリックスとして設定する必要があります。

+0

私は、カメラサービスとGPUの "協力"についての確認を探していました。ありがとう –

0

私はカメラのものを扱ってから約1年が経過していますので、詳細が不明であることをお詫び申し上げます。しかし、カメラプレビューを表示する際のキーは、SurfaceView(またはTextureView)に適用される正しい変換行列を計算して、必要なスケーリングまたは回転を適用することでした。だから、 "誰がローテーションをしているのか"に関しては、あなたが供給しているトランスフォームの指示どおり、それがビューであると言えるでしょう。したがって、マトリクスは、ビューの実際に配置された寸法と、現在のものと比較したデバイスセンサの物理的な向きに比べて、要求したプレビュー解像度(デバイスに対応するもののリストから)の関係に基づいていますデバイスの画面の向き。

古いカメラAPIでは、Camera.CameraInfoには、センサーが搭載されている物理的な向きを指定するorientationフィールドがあります。ほとんどの携帯電話に搭載されているランドスケープセンサーには通常90ですが、実際には上下逆さまに270度もあります。 0と180は存在するかもしれませんが、私はそれらを見たことがありません。

関連する問題