在我们的应用程序中,我们同时支持Camera和Camera2两种拍照接口。我注意到的是,我们在两个API上得到的放大深度不同。
使用Camera1应用编程接口,设置缩放级别非常简单:
Camera.Paramenters params = mCamera.getParameters();
params.setZoom(zoomLevel);
mCamera.setParameters(params);
使用Camera2接口,缩放级别设置如下(取自标准Camera2示例应用程序的代码):
final int zoomScale = 200;
captureBuilder.set(CaptureRequest.SCALER_CROP_REGION, new
Rect(zoomScale * mZoomLevel, zoomScale * mZoomLevel, mStartBounds.right
- (zoomScale * mZoomLevel), mStartBounds.bottom - (zoomScale * mZoomLevel)));
我使用的安卓设备的最大缩放值为4。在缩放级别为4的情况下,Camera1似乎比Camera2放大了更多(至少放大了10%)。
我想知道我的计算中是否遗漏了什么,或者只是Camera2应用程序接口的设计方式。致以问候。
发布于 2018-08-01 02:30:48
我不确定您是如何为zoomScale选择值200的。camera2的裁剪区域位于传感器的active array坐标中,因此,如果您希望进行2倍缩放,则需要将矩形设置为活动阵列的宽度和高度的一半。
粗略的示例代码:
CameraCharacteristics c = cameraManager.getCameraCharacteristics(cameraId);
Rect activeArray = c.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE);
int cropWidth = activeArray.width() / mZoomLevel;
int cropHeight = activeArray.height() / mZoomLevel;
int cropLeft = (activeArray.width() - cropWidth) / 2;
int cropTop = (activeArray.height() - cropHeight) / 2;
Rect cropRegion = new Rect(cropLeft, cropTop, cropLeft + cropWidth, cropTop + cropHeight)
captureBuilder.set(CaptureRequest.SCALER_CROP_REGION, cropRegion);
https://stackoverflow.com/questions/51600378
复制相似问题