4

カメラを90度回転させるポートレート写真を撮りたいという方からのアドバイスがたくさんあります。ただし、実際に「回転」するのはカメラで撮影した画像だけですが、幅と高さの比率は維持されるため、SurfaceViewが狭く、高い。

私が達成しようとしているのは、3x4レイアウトで歪んでいない4x3の写真を撮ることです。かなり狭くなりますが、目的はプレビュービューを-90度回転させ、それでもカメラの通常のアスペクト比を維持することです。現状では、私が試したすべての結果、写真をポートレートレイアウト全体に向けたい場合、画像が押しつぶされてしまいました。

プレビューに-90度回転するマトリックスを適用する必要があるのではないかと思い始めていますが、それをどのように行うか、またはそれが実際に正しいアプローチであるかどうかはわかりません。いくつかのアドバイスが大好きです。

編集:明確にするために、javadocsからの関連する抜粋を次に示します。setPreviewSize() "表示方向が0または180に設定されている場合、プレビューサイズは480x320に設定する必要があります。表示方向が90または270に設定されている場合、プレビューサイズ320x480に設定する必要があります。」

これでは、デバイスを縦向きモードで保持したいが、カメラのプレビューが小さな横向きのウィンドウに表示されるという状況に完全に対処できません(これは私が達成しようとしていることです)。

TIA

4

2 に答える 2

3

カメラのプレビュー出力を表示するために SurfaceView を使用していて、プレビューでも横向きでもプレビューが歪まないようにしたい場合は、SurfaceView の縦横比がカメラの縦横比と一致していることを確認する必要があります。プレビューサイズ。SurfaceView は、プレビューをそれ自体に収まるように拡大縮小するだけなので、プレビュー サイズが 640x480 で 500x500 の場合、プレビューは縦に引き伸ばされて見えます。

概念的に最も単純なアプローチは、SurfaceView のレイアウトをLayoutParamssetLayoutParamsを使用して固定サイズのものに更新することにより、SurfaceView の幅と高さを手動で設定することです。このアプローチの問題は、実際に必要なピクセル単位のサイズを把握する必要があるため、画面サイズが異なると脆弱になる可能性があることです。また、Android でデバイス全体を簡単にレイアウトするには、dp で考える必要があります。ピクセルの代わりに。ただし、テストのために、SurfaceView にテスト デバイスの画面の幅と高さを強制的に設定することができます。

surface height = preview height / preview width * surface width

より良いアプローチは、ビューのonMeasureメソッドで必要なアスペクト比の調整を行う、SurfaceView から継承された新しいクラスを作成することです。詳しく説明すると長くなりますが、詳細については、Android デベロッパー サイトのカスタム コンポーネントのドキュメントを参照してください。ただし、大まかに言えば、構成したカメラ プレビュー サイズと常に同じ縦横比になる幅/高さの値を設定する必要があります。

適切なサイズの surfaceView を取得したら、通常はsetDisplayOrientationを使用してカメラ プレビュー出力を回転させる必要もあります。向きの計算を行うと混乱する可能性があるため、上記のドキュメント リンクで提供されているコード サンプルを使用して解決してください。

基本的に、世界には 1 つの座標系があり、カメラ センサーには別の座標系 (デバイスに固定) があり、UI システムには 3 つ目の座標系 (現在の向きに固定) があり、3 つすべてが互いに相対的に変化する可能性があります。正しいプレビューの向きは、世界に対するデバイスの位置に依存しませんが、カメラによって撮影された写真の向きは異なります (これはsetRotationによって設定されます)。

于 2013-02-25T21:12:27.140 に答える
-6

私の提案は、

Android でレイアウトをこれ以上試してはいけません。それは非常に難しいことです。達成したい場合は、Android のオープンソース コードを読んで、それ自体を変更する必要があります。

したがって、Canvas(Import Graphics package)を使用して、これらのクラスを利用することをお勧めします。

于 2013-02-25T06:09:04.240 に答える