18

ポートレートモードで実行されているこのアプリがあり、1つのアクティビティの一部として、カメラオブジェクトがフラグメントとして実行されています。

前面カメラから背面カメラに切り替えるオプションがあり、背面カメラで写真を撮るときはすべて問題ありません。

でも、正面カメラで写真を撮ると、180度反転してしまいます。これはおそらく、向きが縦向きであることに関係していることがわかりましたが、横向きにすると、アプリケーションのアイデアが失われてしまいます。

とにかくこれを修正して、撮影した写真がプレビューに表示されているものと同じになるようにすることはできますか?

        listener = new OrientationEventListener(this.getActivity(),SensorManager.SENSOR_DELAY_NORMAL){

        @Override
        public void onOrientationChanged(int orientation) {
            // TODO Auto-generated method stub
            if (orientation == ORIENTATION_UNKNOWN) return;
             android.hardware.Camera.CameraInfo info =
                    new android.hardware.Camera.CameraInfo();
             android.hardware.Camera.getCameraInfo(mCurrentCamera, 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;
             }
             if (mCamera.getParameters() != null){
             Camera.Parameters mParameters = mCamera.getParameters();

             mParameters.setRotation(rotation);
             mCamera.setParameters(mParameters);
             }
        }

    };
    listener.enable();
    if (listener.canDetectOrientation())
        Log.d("Orientation Possible", "Orientation Possible");

問題は、写真を撮ってみた後、これがクラッシュすることです。また、プレビューモードでしばらく実行すると、再びクラッシュします。また、おそらく追加する必要があります。別の方法でこれを行っています。

   public void switchCamera(Camera camera) {
    setCamera(camera);
    try {
        camera.setPreviewDisplay(mHolder);
    } catch (IOException exception) {
        Log.e(TAG, "IOException caused by setPreviewDisplay()", exception);
    }
    Camera.Parameters parameters = camera.getParameters();
    parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);

    requestLayout();


    try{
        camera.setParameters(parameters);
    }
    catch (RuntimeException ex){
        Log.d("Preview", "Failure to set proper parameters");
        //need to improve this method
        if (mSupportedPreviewSizes != null) {
            Camera.Size cs = mSupportedPreviewSizes.get(0);
            parameters.setPreviewSize(cs.width, cs.height);
            camera.setParameters(parameters);
            requestLayout();
            //int tempheight = mPreviewSize.height;
            //mPreviewSize.height = mPreviewSize.width;
            //mPreviewSize.width = tempheight;

        }
    }

これは、カメラを切り替えるときに呼び出されます(後ろ向きから前向き、またはその逆)。これはオリエンテーションイベントリスナーに干渉している可能性がありますか?

また、撮った写真を保存するときは、これを呼んでいます。以前はパラメータとしてデータを取り込むだけでしたが、画面の向きも取り入れるようにしました。問題は、何があっても画面の向きが常に90であるということです。そのため、ビットマップは常に90度回転しますが(これはバックカメラで写真を撮るのに最適です)、フロントカメラで撮るときは反転します。この関数に修正を実装できますか?

  public static Bitmap MakeSquare(byte[] data, int orientation) {
    int width;
    int height;
    // Rotate photo
    Matrix matrix = new Matrix();
    matrix.postRotate(orientation);
    // Convert ByteArray to Bitmap
    Bitmap bitPic = BitmapFactory.decodeByteArray(data, 0, data.length);
    width = bitPic.getWidth();
    height = bitPic.getHeight();


    // Create new Bitmap out of the old one
    Bitmap bitPicFinal = Bitmap.createBitmap(bitPic, 0, 0, width, height,matrix, true);
    bitPic.recycle();
    int desWidth;
    int desHeight;
    desWidth = bitPicFinal.getWidth();
    desHeight = desWidth;
    Bitmap croppedBitmap = Bitmap.createBitmap(bitPicFinal, 0,bitPicFinal.getHeight() / 2 - bitPicFinal.getWidth() / 2,desWidth, desHeight);
    croppedBitmap = Bitmap.createScaledBitmap(croppedBitmap, 528, 528, true);
    return croppedBitmap;
}
4

2 に答える 2

35

まあまあ。お世話になっているようです。私はこれからのアドバイスを使用しました:Android、フロントカメラとバックカメラの向き、風景

そして、MakeSquare関数を次のように変更しました。

public static Bitmap MakeSquare(byte[] data, int cameraID) {
    int width;
    int height;
    Matrix matrix = new Matrix();
    Camera.CameraInfo info = new Camera.CameraInfo();
    android.hardware.Camera.getCameraInfo(cameraID, info);
    // Convert ByteArray to Bitmap
    Bitmap bitPic = BitmapFactory.decodeByteArray(data, 0, data.length);
    width = bitPic.getWidth();
    height = bitPic.getHeight();

    // Perform matrix rotations/mirrors depending on camera that took the photo
    if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT)
    {
        float[] mirrorY = { -1, 0, 0, 0, 1, 0, 0, 0, 1};
        Matrix matrixMirrorY = new Matrix();
        matrixMirrorY.setValues(mirrorY);

        matrix.postConcat(matrixMirrorY);
    }

    matrix.postRotate(90);


    // Create new Bitmap out of the old one
    Bitmap bitPicFinal = Bitmap.createBitmap(bitPic, 0, 0, width, height,matrix, true);
    bitPic.recycle();
    int desWidth;
    int desHeight;
    desWidth = bitPicFinal.getWidth();
    desHeight = desWidth;
    Bitmap croppedBitmap = Bitmap.createBitmap(bitPicFinal, 0,bitPicFinal.getHeight() / 2 - bitPicFinal.getWidth() / 2,desWidth, desHeight);
    croppedBitmap = Bitmap.createScaledBitmap(croppedBitmap, 528, 528, true);
    return croppedBitmap;
}

これはうまくいき、うまくいくようです。これが最善の方法かどうかはわかりませんが、満足しています。今私がしなければならないのは、フロントカメラを使用するときになぜ適切なアスペクト比を取り入れないのかを理解することです。

于 2012-04-25T11:22:36.930 に答える
2

これらのリンクを試してみてください。

http://developer.android.com/reference/android/hardware/Camera.html#setDisplayOrientation(int

http://developer.android.com/reference/android/hardware/Camera.Parameters.html#setRotation(int

具体的には、setRotationリンクからの冗長性のチャンクを次に示します。

「アプリケーションがユーザーに表示される方向に合わせて画像を回転させたい場合、アプリはOrientationEventListenerとCamera.CameraInfoを使用する必要があります。OrientationEventListenerの値は、デバイスの自然な方向を基準にしています。CameraInfo.orientationは、カメラの方向とカメラの方向の間の角度です。自然なデバイスの向き。2つの合計は背面カメラの回転角です。2つの違いは前面カメラの回転角です。前面カメラのJPEG画像はプレビューのようにミラーリングされないことに注意してください。画面。"

私はこのコードをそのまま使用しましたが、まったく変更しませんでした。私のカメラは今は良くなっていますが、それでもTLCが必要です。また、私はまだ正面向きの機能を持っていません。

幸運を!

于 2012-04-23T15:37:58.283 に答える