当Android Camera2预览被拉伸时,可以通过设置预览尺寸和相机输出尺寸来解决。以下是一个代码示例,演示如何在Camera2应用程序中解决预览拉伸问题:
// 获取相机输出尺寸
StreamConfigurationMap map = cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
Size[] outputSizes = map.getOutputSizes(SurfaceTexture.class);
// 选择合适的预览尺寸
Size previewSize = chooseOptimalSize(outputSizes, desiredWidth, desiredHeight);
// 设置预览尺寸
textureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() {
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width, int height) {
// 设置预览尺寸
surfaceTexture.setDefaultBufferSize(previewSize.getWidth(), previewSize.getHeight());
// 打开相机
openCamera();
}
// 其他回调方法...
});
// 选择最佳预览尺寸的方法
private Size chooseOptimalSize(Size[] choices, int desiredWidth, int desiredHeight) {
List bigEnough = new ArrayList<>();
for (Size option : choices) {
if (option.getWidth() >= desiredWidth && option.getHeight() >= desiredHeight) {
bigEnough.add(option);
}
}
// 如果存在合适的预览尺寸,则选择最小的尺寸
if (bigEnough.size() > 0) {
return Collections.min(bigEnough, new Comparator() {
@Override
public int compare(Size lhs, Size rhs) {
return Long.signum((long) lhs.getWidth() * lhs.getHeight() - (long) rhs.getWidth() * rhs.getHeight());
}
});
} else {
// 如果没有合适的预览尺寸,则选择最大的尺寸
return choices[0];
}
}
在这个示例中,chooseOptimalSize()
方法用于选择最适合的预览尺寸。它首先找到所有宽度和高度大于或等于所需宽度和高度的尺寸,然后选择最小的尺寸。如果没有找到合适的尺寸,则选择输出尺寸列表中的第一个尺寸。然后,在onSurfaceTextureAvailable()
方法中,将预览尺寸设置为SurfaceTexture
的默认缓冲区大小。
通过使用这种方法,您可以在Camera2应用程序中解决Android Camera2预览被拉伸的问题。