我正在尝试使用Camera2 API实现自定义尺寸的相机视图(预览和捕获)。特别是4:3的比例,但横向预览(宽度>高度)。
到目前为止,我能够获得正确的TextureView大小,但预览被垂直压缩,或者正确预览,但TextureView大小超出了所需的容器大小。
尝试使用以下代码设置SCALER_CROP_REGION
,但无效。
val sensorRect = cameraCharacteristics
.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE)
?: return@run
val sensorWidth = sensorRect.width()
val sensorToViewRatio = sensorWidth / preview.width.toFloat()
val sensorBottom = (preview.height * sensorViewRatio).roundToInt() + sensorRect.top
previewRequestBuilder.set(
CaptureRequest.SCALER_CROP_REGION,
Rect(sensorRect.left, sensorRect.top, sensorRect.right, sensorBottom)
)
也尝试了textureView.setTransform(matrix)
和setRectToRect
和postScale
的运气,但是没有运气。裁剪了预览表面本身,但实际的预览仍然受到挤压。
实现这种自定义预览和捕获大小的正确和推荐方法是什么?
我正在使用google's CameraView library的增强版。
可以找到CameraViewEx我正在使用的库here代码库。
下面是与实现预期行为有关的类。
答案 0 :(得分:2)
SCALER_CROP_REGION不会更改输出的宽高比。主要的开发人员文档并不太清楚,但是有一些图表here显示了裁剪的过程。
要求图像传感器与设备的长边对齐,因此,横向放置的设备将轻松显示横向预览。那么,您是否在询问具有UI的“纵横比”视图的肖像UI布局?
通常,如果不添加黑色条进行预览(在这种情况下,在左侧和右侧),或者裁剪并缩放(删除大部分视场;大约45%),就无法做到这一点4:3的宽高比)。
后者应该可以通过TextureView的转换实现,但是您必须确保从TextureView上已经设置的转换开始,或者必须考虑更多涉及传感器,设备和UI相对方向的转换