わかりました、私はこれを理解したと思います。ことわざのパズルにはいくつかのピースがありました。これを解決するのに役立つ洞察を提供してくれた @kcoppock に感謝します。
まず、選択するプレビュー サイズを決定する際に、向きを考慮する必要があります。たとえば、そのアプリのバージョンの向きが横向きにロックされているという理由だけで、の は向きを認識しませgetOptimalPreviewSize()
んCameraPreview
。ApiDemos
向きをフロートさせたい場合は、ターゲットの縦横比を逆にして一致させる必要があります。だから、どこgetOptimalPreviewSize()
にある:
double targetRatio=(double)width / height;
次も必要です。
if (displayOrientation == 90 || displayOrientation == 270) {
targetRatio=(double)height / width;
}
wheredisplayOrientation
は 0 から 360 の値で、約 100 行の非常に醜いコードから判断しています。そのため、これらすべてを再利用可能なコンポーネントにまとめて、まもなく公開します。そのコードは、setDisplayOrientation()
JavaDocsとこの StackOverflow answerに基づいています。
(ところで、2013 年 7 月 1 日以降にこれを読んでいて、そのコンポーネントへのこの回答にリンクが表示されない場合は、忘れていたので、コメントを投稿して思い出させてください)
SurfaceView
次に、使用している/の縦横比を制御するときに、そのディスプレイの向きを考慮する必要がありますTextureView
。からのCameraPreview
アクティビティには、縦横比を処理するApiDemos
独自のPreview
ViewGroup
ものがあり、縦向きで使用するには縦横比を逆にする必要があります。
if (displayOrientation == 90
|| displayOrientation == 270) {
previewWidth=mPreviewSize.height;
previewHeight=mPreviewSize.width;
}
else {
previewWidth=mPreviewSize.width;
previewHeight=mPreviewSize.height;
}
ここdisplayOrientation
で、同じ値です(それぞれ縦向き90
と270
逆向きの縦向きです。逆向きの縦向きまたは逆向きの横向きを機能させることを試みていないことに注意してください。したがって、さらに調整が必要になる場合があります)。
3 つ目は、私が腹立たしく思っていることですがsetPictureSize()
、Camera.Parameters
. そうしないと、画像の縦横比がプレビュー フレームに適用されて、問題が発生するかのようになります。
そのため、次のようなコードを使用していました。
Camera.Parameters parameters=camera.getParameters();
Camera.Size pictureSize=getHost().getPictureSize(parameters);
parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
parameters.setPictureSize(pictureSize.width, pictureSize.height);
parameters.setPictureFormat(ImageFormat.JPEG);
camera.setParameters(parameters);
camera.startPreview();
それは間違っています。本当に必要なものは次のとおりです。
Camera.Parameters parameters=camera.getParameters();
Camera.Size pictureSize=getHost().getPictureSize(parameters);
parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
camera.setParameters(parameters);
camera.startPreview();
parameters=camera.getParameters();
parameters.setPictureSize(pictureSize.width, pictureSize.height);
parameters.setPictureFormat(ImageFormat.JPEG);
camera.setParameters(parameters);
その変更がなければ、横向きであっても縦横比が引き伸ばされます。彼らは写真を撮っていなかったので、これは問題ではありませんCameraPreview
でした。ApiDemos
setPictureSize()
しかし、これまでのところ、Nexus 4 では縦向きと横向きの正方形の縦横比があり、向きはフローティング (つまり、横向きに固定されていません) です。
他のデバイスで必要な他のハッキングに遭遇した場合は、この質問を修正することを忘れないようにします。また、リリースされたときにCameraView
/コンポーネントにリンクするようにします。CameraFragment
更新 #1
もちろん、これほど単純なことはあり得ません。:-)
アスペクト比を台無しにする問題の修正がsetPictureSize()
機能します... 写真を撮るまで。その時点で、プレビューが間違った縦横比に切り替わります。
1 つの可能性は、画像をプレビューと同じ (または非常に近い) 縦横比を持つものに制限することです。ユーザーはカメラが提供する画像サイズを取得できるはずなので、その答えは好きではありません。
次の方法で、損傷の範囲を制限できます。
Camera.Parameters
撮影直前の画像サイズ等のみ更新
- 撮影
Camera.Parameters
後、撮影前に戻す
これは、写真が撮られている間、間違った縦横比を示します。これに対する長期的な解決策は、私が思うに、写真を撮っている間、一時的にカメラのプレビューを静止画像 (最後のプレビュー フレーム) に置き換えることです。私は最終的にこれを試してみます。
更新 #2 :私の CWAC-Camera ライブラリの v0.0.1が利用可能になり、前述のコードが組み込まれました。