camera2 设置分辨率
时间: 2023-09-30 21:03:44 浏览: 389
在使用 camera2 API 设置分辨率时,需要执行以下步骤:
1. 获取可用的输出尺寸列表:在创建 CameraCharacteristics 对象时,可以通过 get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP) 方法获取到 CameraCharacteristics 中的 SCALER_STREAM_CONFIGURATION_MAP 属性,然后调用其方法 getOutputSizes(format) 获取可用的输出尺寸列表。
2. 选择合适的输出尺寸:在获取到可用的输出尺寸列表后,需要根据需求选择合适的输出尺寸。可以根据尺寸大小、宽高比等条件进行筛选。
3. 设置输出尺寸:在创建 CaptureRequest.Builder 对象时,可以通过 set(CaptureRequest.CONTROL_CAPTURE_INTENT, CaptureRequest.CONTROL_CAPTURE_INTENT_PREVIEW) 方法设置 CaptureRequest 的控制模式为预览模式,然后通过 set(CaptureRequest.SCALER_CROP_REGION, cropRegion) 方法设置裁剪区域,最后通过 set(CaptureRequest.SCALER_OUTPUTS, outputSurfaces) 方法设置输出 Surface 列表。
下面是一个示例代码:
```
CameraCharacteristics cameraCharacteristics = cameraManager.getCameraCharacteristics(cameraId);
StreamConfigurationMap streamConfigurationMap = cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
Size[] outputSizes = streamConfigurationMap.getOutputSizes(SurfaceTexture.class);
// 选择合适的输出尺寸
Size previewSize = chooseOptimalSize(outputSizes, desiredWidth, desiredHeight);
// 设置输出尺寸
CaptureRequest.Builder builder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
Rect zoom = new Rect(0, 0, previewSize.getWidth(), previewSize.getHeight());
builder.set(CaptureRequest.SCALER_CROP_REGION, zoom);
SurfaceTexture surfaceTexture = textureView.getSurfaceTexture();
surfaceTexture.setDefaultBufferSize(previewSize.getWidth(), previewSize.getHeight());
Surface previewSurface = new Surface(surfaceTexture);
builder.addTarget(previewSurface);
cameraDevice.createCaptureSession(Arrays.asList(previewSurface), new CameraCaptureSession.StateCallback() {...}, null);
```
其中,chooseOptimalSize() 方法是一个自定义的方法,用于选择合适的输出尺寸。
阅读全文