在横向模式下,Android Camera2 Preview旋转了90度 [英] Android Camera2 Preview is rotated 90deg while in Landscape

查看:1011
本文介绍了在横向模式下,Android Camera2 Preview旋转了90度的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在遵循 youtube教程,试图学习Camera2 API.当然,我在开发自己的应用程序的同时就学到了这一点.本教程与我的应用程序之间的不一致之处在于,该教程仅在我的应用程序必须处于横向模式时才将相机设为纵向模式.

I was following a youtube tutorial, trying to learn Camera2 API. Of course, I was learning this at the same time that I was developing my own app. One inconsistency between the tutorial and my app is that the tutorial made the camera in portrait mode only while my app must be in landscape.

我目前可以查看相机的预览,尽管当我的应用处于横向或水平状态时,相机的预览看起来旋转了90度.几乎感觉像我可以旋转TextureView,但这似乎不正确,例如当我拍照时,它会被错误地旋转.

I'm currently able to view the preview of the camera, though while my app is in landscape or horizontal, the camera preview looks rotated 90 degrees. It almost feels like I can rotate the TextureView, but that just seems incorrect, like when I take a picture, it will be rotated incorrectly.

下面是与图像大小有关的代码(整个代码很长)

Below is the code that has to do with image sizes (the whole code is very long)

private void setupCamera(int width, int height) {
    CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
    try {
        CameraCharacteristics cameraCharacteristics = cameraManager.getCameraCharacteristics(camera_id);
        StreamConfigurationMap map = cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
        cameraCharacteristics.get(CameraCharacteristics.SENSOR_ORIENTATION);
        mPreviewSize = getPreferredPreviewSize(map.getOutputSizes(SurfaceTexture.class), width, height);
        mCameraId = camera_id;
    } catch (CameraAccessException e) {
        e.printStackTrace();
    }
}


//TODO Look for a way to make this horizontal
private Size getPreferredPreviewSize(Size[] mapSizes, int width, int height) {
    List<Size> collectorSizes = new ArrayList<>();
    for (Size option : mapSizes) {
        if (width > height) { //If the screen is in landscape
            Toast.makeText(getApplicationContext(), "Screen is Landscape", Toast.LENGTH_SHORT).show();
            if (option.getWidth() > width && option.getHeight() > height) {
                collectorSizes.add(option);
            }
        } else { //if the screen is in portrait
            Toast.makeText(getApplicationContext(), "Screen is Portrait", Toast.LENGTH_SHORT).show();
            if (option.getWidth() > height && option.getHeight() > width) {
                collectorSizes.add(option);
            }
        }
    }
    if (collectorSizes.size() > 0) {
        return Collections.min(collectorSizes, new Comparator<Size>() {
            @Override
            public int compare(Size lhs, Size rhs) {
                return Long.signum(lhs.getWidth() * lhs.getHeight() - rhs.getWidth() + rhs.getHeight());
            }
        });
    }

    return mapSizes[0];
}
private void openCamera() {
    CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
    try {
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
            return;
        }
        cameraManager.openCamera(mCameraId, mCameraDeviceStateCallback, null);
    } catch (CameraAccessException e){
        e.printStackTrace();
    }
}

private void createCameraPreviewSession() {
    try {
        SurfaceTexture surfaceTexture = mTextureView.getSurfaceTexture();
        surfaceTexture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
        Surface previewSurface = new Surface(surfaceTexture);
        mPreviewCaptureRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
        mPreviewCaptureRequestBuilder.addTarget(previewSurface);
        mCameraDevice.createCaptureSession(Arrays.asList(previewSurface),
                new CameraCaptureSession.StateCallback() {
                    @Override
                    public void onConfigured(CameraCaptureSession session) {
                        if(mCameraDevice == null){
                            return;
                        }
                        try {
                            mPreviewCaptureRequest = mPreviewCaptureRequestBuilder.build();
                            mCameraCaptureSession = session;
                            mCameraCaptureSession.setRepeatingRequest(mPreviewCaptureRequest, mSessionCaptureCallback, null);
                        } catch (CameraAccessException e){
                            e.printStackTrace();
                        }
                    }

                    @Override
                    public void onConfigureFailed(CameraCaptureSession session) {
                        Toast.makeText(getApplicationContext(), "Preview Session Failed", Toast.LENGTH_SHORT).show();
                    }
                }, null);
    } catch (CameraAccessException e){
        e.printStackTrace();
    }
}

我一直在使用getPreferredPreviewSize方法,但是我不太了解它.我不确定使用lhsrhs结尾的compare.

I've been playing with the getPreferredPreviewSize method, but I don't understand it as well as I should. I'm not sure about the compare at the end of that using lhs and rhs.

我想简单地旋转一下吗?

Am I missing something simple to have this rotated?

推荐答案

private void transformImage (int width, int height)
{
    if(mPreviewSize == null || mTextureView == null)
    {
        return;
    }
    Matrix matrix = new Matrix();
    int rotation = getWindowManager().getDefaultDisplay().getRotation();
    RectF textureRectF = new RectF(0,0,width,height);
    RectF previewRectF = new RectF(0,0,mPreviewSize.getHeight(),mPreviewSize.getWidth());
    float centerX = textureRectF.centerX();
    float centery = textureRectF.centerY();

    if(rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_270)
    {}
    else if(rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270)
    {
        previewRectF.offset(centerX - previewRectF.centerX(),centery-previewRectF.centerY());
        matrix.setRectToRect(textureRectF,previewRectF,Matrix.ScaleToFit.FILL);
        float scale = Math.max((float)width / mPreviewSize.getWidth(),(float)height/ mPreviewSize.getHeight());

        matrix.postScale(scale,scale,centerX,centery);
        matrix.postRotate(90*(rotation-2),centerX,centery);
        mTextureView.setTransform(matrix );

    }

这篇关于在横向模式下,Android Camera2 Preview旋转了90度的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆