謎なカメラのorientation

今までintentで内部のカメラアプリを起動さしてjpgをgetしてたけど、今回シャッターの制御が必要になったので自作カメラアプリを作った。

なぜか一番悩んだのが画像の向きだ。

横にしたり縦にしたりしても、Exif情報がなんか1に固定されている。

仕方ないので

protected void configureCameraParameters(Camera.Parameters cameraParams, boolean portrait) {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.FROYO) { // for 2.1 and before
        if (portrait) {
            cameraParams.set(CAMERA_PARAM_ORIENTATION, CAMERA_PARAM_PORTRAIT);
        } else {
            cameraParams.set(CAMERA_PARAM_ORIENTATION, CAMERA_PARAM_LANDSCAPE);
        }
    } else { // for 2.2 and later
        int angle;
        int angle2;
        Display display = mActivity.getWindowManager().getDefaultDisplay();
        switch (display.getRotation()) {
            case Surface.ROTATION_0: // This is display orientation
                angle = 90; // This is camera orientation
                angle2=0;
                break;
            case Surface.ROTATION_90:
                angle = 0;
                angle2=270;
                break;
            case Surface.ROTATION_180:
                angle = 270;
                angle2=180;
                break;
            case Surface.ROTATION_270:
                angle = 180;
                angle2=0;
                break;
            default:
                angle = 90;
                angle2=90;
                break;
        }
        Log.v(LOG_TAG, "angle: " + angle);
        onOrientationChanged(angle2);
        mCamera.setDisplayOrientation(angle);
    }

 

public void onOrientationChanged(int orientation) {
    //if (orientation == ORIENTATION_UNKNOWN) return;
    android.hardware.Camera.CameraInfo info =
            new android.hardware.Camera.CameraInfo();
    android.hardware.Camera.getCameraInfo(mCameraId, info);
    orientation = (orientation + 45) / 90 * 90;
    int rotation = 0;
    if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
        rotation = (info.orientation - orientation + 360) % 360;
    } else {  // back-facing camera
        rotation = (info.orientation + orientation) % 360;
    }
    Camera.Parameters cameraParams = mCamera.getParameters();
    cameraParams.setRotation(rotation);
    mCamera.setParameters(cameraParams);
}

で対応さした。

謎なのがDisplayのangleとカメラのangleが違うところだ。

よくわからない処理が行われているのだろうきっと。

これで動いたからよしとする。

↓弊社で開発、販売しているソフトウェアです↓

MediMonitor無料ダウンロード  

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です