1

電話を回転させてもカメラの向きが変わらないようにして、カメラがどの向きでも正立した写真を撮れるようにしたいと思います。現在、画像は 1 つを除くすべての方向で正しく回転されません。2.2 を実行している HTC Incredible でテスト済み:

  • ポートレート モードでは、本来あるべき姿から時計回りに 90 度回転した画像が表示されます。
  • デバイスを縦向きから反時計回りに回転させると、180 度回転した画像になります。
  • デバイスを縦向きから時計回りに回転すると、正しい向きの画像が得られます。

カメラの実装に関連するコードは次のとおりです。

    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.camera);

    // Set up camera's SurfaceView and SurfaceHolder
    surfaceView = (SurfaceView) findViewById(R.id.camera_surface);
    surfaceHolder = surfaceView.getHolder();
    surfaceHolder.addCallback(this);
    surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

}

public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) {
    Camera.Parameters p = camera.getParameters();
    p.setPreviewSize(width,height);
}

public void surfaceCreated(SurfaceHolder holder) {
    camera = Camera.open();
    try {
        camera.setPreviewDisplay(surfaceHolder);
    } catch (IOException e) {
        camera.release();
    }
    camera.startPreview();
}

ユーザーベースを最大化するために、アプリケーションが 4 以上の API レベルと互換性を持つようにしたいので、より高い API レベルに固有のものを使用しない回答を希望します。ありがとう!

4

3 に答える 3

0

これにより、前面カメラと背面カメラの異なる処理を含め、画面の向きに注意する必要があります。

// Set camera rotation (consider display orientation)
Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
int displayOrientation = display.getRotation();

int rotation = cameraInfo.orientation;
if (Surface.ROTATION_0 != displayOrientation)
{
    if (CameraInfo.CAMERA_FACING_BACK == cameraInfo.facing)
    {
        if (Surface.ROTATION_90 == displayOrientation)
        {
            rotation -= 90;
        }
        else if (Surface.ROTATION_180 == displayOrientation)
        {
            rotation -= 180;
        }
        if (Surface.ROTATION_270 == displayOrientation)
        {
            rotation -= 270;
        }

        if (rotation < 0)
        {
            rotation += 360;
        }
    }
    else
    {
        if (Surface.ROTATION_90 == displayOrientation)
        {
            rotation += 90;
        }
        else if (Surface.ROTATION_180 == displayOrientation)
        {
            rotation += 180;
        }
        if (Surface.ROTATION_270 == displayOrientation)
        {
            rotation += 270;
        }

        rotation %= 360;
    }
}

Log.d(TAG, "Camera orientation (" + cameraInfo.orientation + ", " + displayOrientation + ", " + rotation + ")");

cameraParams.setRotation(rotation);
于 2014-03-26T08:29:33.327 に答える
0

これを試してみてください、しかしそれはバグだと思います。私もこの問題を抱えていますが、私の状況では何も見つかりません。

このコードは正しい可能性があり、カメラのプレビューを使用するときに役立つ可能性があります。

そうでない場合 - このコードは役に立ちません。カメラなしで使用しているので、役に立ちません。

public void surfaceCreated(SurfaceHolder holder)  
{
    try
    {
        camera.setPreviewDisplay(holder);
        camera.setPreviewCallback(this);
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }
    Size previewSize = camera.getParameters().getPreviewSize();
    float aspect = (float) previewSize.width / previewSize.height;

    int previewSurfaceWidth = preview.getWidth();
    int previewSurfaceHeight = preview.getHeight();

    LayoutParams lp = preview.getLayoutParams();


    if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE)
    {
        // ïîðòðåòíûé âèä
        camera.setDisplayOrientation(90);
        lp.height = previewSurfaceHeight;
        lp.width = (int) (previewSurfaceHeight / aspect);
    }
    else
    {
        camera.setDisplayOrientation(0);
        lp.width = previewSurfaceWidth;
        lp.height = (int) (previewSurfaceWidth / aspect);
    }

    preview.setLayoutParams(lp);
    camera.startPreview();


}
于 2011-03-22T10:33:14.833 に答える