返回

Camera2挖坑日记---如何解决预览画面变形

Android

Camera2简介

Camera2是目前Android相机开发最新的API,旧版本的Camera已经被废弃了。一般情况下,Camera2的使用是将图像发送到SurfaceView或者TextureView【通过SurfaceTexture】来预览。使用JPEG或者Raw sensor格式的Ima…

问题

在使用Camera2进行预览时,可能会遇到预览画面变形的问题。这种变形通常表现为图像被拉伸或压缩,或者出现鱼眼效果。

问题原因

预览画面变形的原因有很多,其中最常见的原因是:

  • 传感器和预览视图的宽高比不一致。
  • 传感器和预览视图的像素比例不一致。
  • 传感器和预览视图的旋转角度不一致。

解决方案

针对不同的原因,我们可以采取不同的解决方案:

  • 如果传感器和预览视图的宽高比不一致,我们可以通过设置Camera2的输出尺寸来调整预览视图的宽高比。
  • 如果传感器和预览视图的像素比例不一致,我们可以通过设置Camera2的缩放模式来调整预览视图的像素比例。
  • 如果传感器和预览视图的旋转角度不一致,我们可以通过设置Camera2的旋转角度来调整预览视图的旋转角度。

示例代码

// 设置Camera2的输出尺寸
CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
String cameraId = manager.getCameraIdList()[0];
CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId);
Size[] outputSizes = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP).getOutputSizes(SurfaceTexture.class);
Size outputSize = outputSizes[0];

// 设置Camera2的缩放模式
CameraDevice.StateCallback stateCallback = new CameraDevice.StateCallback() {
    @Override
    public void onOpened(@NonNull CameraDevice camera) {
        // 设置Camera2的输出尺寸
        SurfaceTexture surfaceTexture = textureView.getSurfaceTexture();
        surfaceTexture.setDefaultBufferSize(outputSize.getWidth(), outputSize.getHeight());

        // 设置Camera2的缩放模式
        CameraCaptureSession.StateCallback sessionStateCallback = new CameraCaptureSession.StateCallback() {
            @Override
            public void onConfigured(@NonNull CameraCaptureSession session) {
                try {
                    CaptureRequest.Builder builder = camera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
                    builder.addTarget(surfaceTexture);
                    session.setRepeatingRequest(builder.build(), null, null);
                } catch (CameraAccessException e) {
                    e.printStackTrace();
                }
            }
        };

        camera.createCaptureSession(Arrays.asList(surfaceTexture), sessionStateCallback, null);
    }
};

manager.openCamera(cameraId, stateCallback, null);

总结

通过本文的介绍,我们了解了Camera2预览画面变形的原因和解决方案。在实际开发中,我们可以根据自己的需求选择合适的解决方案来解决预览画面变形的问题。