1

カメラを内蔵したアプリケーションを作成しています。アクティビティは縦向きに固定されていますが、次のように画像を正しく保存したいです。

Camera camera = getCameraInstance(); //method found on http://developer.android.com/guide/topics/media/camera.html
Camera.Parameters params = camera.getParameters();
params.setRotation(someInteger); //I want to get the proper value for this method
camera.setParameters(params);

誰もこれを達成できましたか?

4

1 に答える 1

3

takePictureの呼び出しから受け取ったJPEG画像を回転させようとしているだけの場合は、setRotationが適切な方法です。

setRotationに渡す値についての質問はありますか?保存されたJPEG画像で実際の「上」を「上」にしたい場合、setRotateは、世界に対するカメラセンサーの現在の向きに基づいて設定する必要があります。

デバイス全体の世界に対する相対的な向きを確認し、カメラセンサーの向きがデバイスの「自然な」向きを基準にして、2つの回転を組み合わせて最終的な答えを得ることができます。計算は間違えやすいので、setRotationのAPIドキュメントで明示的に説明しています。ここに再現されています。

public void onOrientationChanged(int orientation) {
   if (orientation == ORIENTATION_UNKNOWNsetRotation) return;
   android.hardware.Camera.CameraInfo info =
        new android.hardware.Camera.CameraInfo();
   android.hardware.Camera.getCameraInfo(cameraId, info);
   orientation = (orientation + 45) / 90 * 90;
   int rotation = 0;
   if (info.facing == CameraInfo.CAMERA_FACING_FRONT) {
     rotation = (info.orientation - orientation + 360) % 360;
   } else {  // back-facing camera
     rotation = (info.orientation + orientation) % 360;
   }
   mParameters.setRotation(rotation);
}

OrientationEventListenerから継承し、コールバックメソッドに上記を実装する必要があります。もちろん、パラメータを更新する前に、カメラが開いていること、およびmParametersなどが有効であることを確認する必要があります。

これは、カメラから送信されるJPEGのみを回転させることに注意してください。プレビューがUIで正しく方向付けられていないことがわかった場合は、そのためにsetDisplayOrientationを呼び出す必要があります。カメラセンサーは通常、デバイスの横向きに配置されているため、横向きのカメラアプリは、通常とは異なるAndroidデバイスを使用している場合でも、この関数を呼び出さなくても逃げることができます。ただし、縦向きのアプリを作成している場合は、UIに合わせて表示の向きを調整する必要があります。setRotationと同様に、いくつかの要素を考慮する必要があります。計算を正しく行うためのサンプルコードは、ドキュメントに含まれています。

于 2013-01-30T20:00:19.183 に答える