Android Camera预览画面变形问题

csdn

问题

安卓camera1在预览时,预览画面看起来被拉伸了.
如图,圆形的盖子,变成椭圆形了.
在这里插入图片描述

代码

默认流程,如下为大致的打开摄像头并进行预览显示的代码

private Camera mCamera = null;
private SurfaceView mSurfaceView = null;
private SurfaceHolder holder = null;


mSurfaceView = (SurfaceView) findViewById(R.id.surfaceView);
holder = mSurfaceView.getHolder();
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

mCamera = Camera.open(mCameraId);
// .... 中间设置方向等省略
mCamera.setPreviewDisplay(holder);
mCamera.startPreview();

解决

  1. 网上大部分的解决方法(实测不一定有效)
    原理是遍历摄像头分辨率,找到与当前屏幕契合的分辨率,并设置为预览大小.
    如下代码,getOptimalPreviewSize的调用放在上面的mCamera.startPreview();之前.
Camera.Parameters parameters = null;
parameters = mCamera.getParameters();
DisplayMetrics dm = getResources().getDisplayMetrics();
List<Size> previewSizes = parameters.getSupportedPreviewSizes();
Size previewSize = getOptimalPreviewSize(previewSizes, dm.widthPixels, dm.heightPixels);
parameters.setPreviewSize(previewSize.width, previewSize.height);

private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) {
    
    
    final double ASPECT_TOLERANCE = 0.1;
    double targetRatio = (double) w / h;
    if (sizes == null)
        return null;

    Size optimalSize = null;
    double minDiff = Double.MAX_VALUE;

    int targetHeight = h;

    // Try to find an size match aspect ratio and size
    for (Size size : sizes) {
    
    
        double ratio = (double) size.width / size.height;
        if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE)
            continue;
        int tempDiff = Math.abs(size.height - targetHeight);
        if (tempDiff < minDiff) {
    
    
            optimalSize = size;
            minDiff = tempDiff;
        }
    }

    // Cannot find the one match the aspect ratio, ignore the requirement
    if (optimalSize == null) {
    
    
        minDiff = Double.MAX_VALUE;
        for (Size size : sizes) {
    
    
            if (Math.abs(size.height - targetHeight) < minDiff) {
    
    
                optimalSize = size;
                minDiff = Math.abs(size.height - targetHeight);
            }
        }
    }
    return optimalSize;
}
  1. 实测可用方法
    把摄像头预览大小设置成屏幕显示大小,在mCamera.startPreview()调用如下代码
public static void setCameraPreviewSize(Camera camera) {
    
    
    WindowManager manager = (WindowManager) FactoryTestApplication.getContext().getSystemService(Context.WINDOW_SERVICE);
    Display display = manager.getDefaultDisplay();
    Parameters parameters = camera.getParameters();
    parameters.setPreviewSize(display.getHeight(), display.getWidth());
    camera.setParameters(parameters);
}

显示正常图如下
在这里插入图片描述
作者:帅得不敢出门 csdn原创谢绝转载

猜你喜欢

转载自blog.csdn.net/zmlovelx/article/details/132205387