簡體   English   中英

Camera2前置攝像頭預覽旋轉

[英]Camera2 front camera preview rotation

我正在使用camera2,但旋轉有問題。 在某些設備中,切換到前置攝像頭時,預覽會旋轉180度。 正在為camera2尋找這樣的“ setDefaultOrientation()”方法,但找不到它。

謝謝

使用GLSurfaceView,大概是在使用SurfaceTexture將相機預覽流映射到GL紋理,然后進行渲染。

紋理中的圖像數據不會自動旋轉為“垂直”-一方面,操作系統無法知道如何渲染紋理。

但是,SurfaceTexture有一個getTransformMatrix調用,當連接到camera2 API時,它將為您提供從攝像頭方向到設備原始方向的必要轉換(通常是手機的肖像,平板電腦的風景,但並非總是如此)。 然后,您必須將從本機方向到應用程序方向的變換添加到此矩陣,然后應用組合的矩陣變換來調整預覽圖像。

您可以設置正確的圖像旋轉CaptureRequest的對象,同時拍攝圖像CameraCaptureSession.StateCallback使用CameraCharacterisitics

CameraCharacterisitics cameraCharacteristics = cameraManager.getCameraCharacteristics(cameraId);

像這樣。

private CameraCaptureSession.StateCallback sessionStateCallback = new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(@NonNull CameraCaptureSession session) {
  captureSession = session;
  try {
    CaptureRequest.Builder builder = session.getDevice().createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
    builder.addTarget(imageReader.getSurface());
    builder.set(CaptureRequest.JPEG_ORIENTATION, cameraCharacteristics.get(CameraCharacteristics.SENSOR_ORIENTATION));
    session.capture(builder.build(), null, backgroundHandler);
  } catch (CameraAccessException e) {
    Log.d("tag", e.getMessage());
  }
}

@Override
public void onConfigureFailed(@NonNull CameraCaptureSession session) {
}
};

您可以嘗試使用此代碼打開相機

我希望這個能幫上忙

public void startPreview() {
    try {
        Log.i(TAG, "starting preview: " + started);

        // ....
        Camera.CameraInfo camInfo = new Camera.CameraInfo();
        Camera.getCameraInfo(cameraIndex, camInfo);
        int cameraRotationOffset = camInfo.orientation;
        // ...

        Camera.Parameters parameters = camera.getParameters();
        List<Camera.Size> previewSizes = parameters.getSupportedPreviewSizes();
        Camera.Size previewSize = null;
        float closestRatio = Float.MAX_VALUE;

        int targetPreviewWidth = isLandscape() ? getWidth() : getHeight();
        int targetPreviewHeight = isLandscape() ? getHeight() : getWidth();
        float targetRatio = targetPreviewWidth / (float) targetPreviewHeight;

        Log.v(TAG, "target size: " + targetPreviewWidth + " / " + targetPreviewHeight + " ratio:" + targetRatio);
        for (Camera.Size candidateSize : previewSizes) {
            float whRatio = candidateSize.width / (float) candidateSize.height;
            if (previewSize == null || Math.abs(targetRatio - whRatio) < Math.abs(targetRatio - closestRatio)) {
                closestRatio = whRatio;
                previewSize = candidateSize;
            }
        }

        int rotation = getWindowManager().getDefaultDisplay().getRotation();
        int degrees = 0;
        switch (rotation) {
        case Surface.ROTATION_0:
            degrees = 0;
            break; // Natural orientation
        case Surface.ROTATION_90:
            degrees = 90;
            break; // Landscape left
        case Surface.ROTATION_180:
            degrees = 180;
            break;// Upside down
        case Surface.ROTATION_270:
            degrees = 270;
            break;// Landscape right
        }
        int displayRotation;
        if (isFrontFacingCam) {
            displayRotation = (cameraRotationOffset + degrees) % 360;
            displayRotation = (360 - displayRotation) % 360; // compensate
                                                                // the
                                                                // mirror
        } else { // back-facing
            displayRotation = (cameraRotationOffset - degrees + 360) % 360;
        }

        Log.v(TAG, "rotation cam / phone = displayRotation: " + cameraRotationOffset + " / " + degrees + " = "
                + displayRotation);

        this.camera.setDisplayOrientation(displayRotation);

        int rotate;
        if (isFrontFacingCam) {
            rotate = (360 + cameraRotationOffset + degrees) % 360;
        } else {
            rotate = (360 + cameraRotationOffset - degrees) % 360;
        }

        Log.v(TAG, "screenshot rotation: " + cameraRotationOffset + " / " + degrees + " = " + rotate);

        Log.v(TAG, "preview size: " + previewSize.width + " / " + previewSize.height);
        parameters.setPreviewSize(previewSize.width, previewSize.height);
        parameters.setRotation(rotate);
        camera.setParameters(parameters);
        camera.setPreviewDisplay(mHolder);
        camera.startPreview();

        Log.d(TAG, "preview started");

        started = true;
    } catch (IOException e) {
        Log.d(TAG, "Error setting camera preview: " + e.getMessage());
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM