Android 自定义相机 Camera 预览变形拉伸问题

前几天遇到一个需求拍摄省份证需要加一个框,需要自定义一个浏览页面,我就自定义了一下相机发现拍摄预览的时候图像是变形的,我就各种查找解决方案,自定义相机步骤我就不说了,直接说说我怎么解决的:

首先要想不变形拉伸要保证三点一定要一样:
1.预览View的尺寸;
2.选取合适的预览分辨率;

List pictureSizeList = parameters.getSupportedPictureSizes();

3.选取相机支持的图片尺寸;

List previewSizeList = parameters.getSupportedPreviewSizes();

上面两个方法返回大致是如下:
后补。。。

其实理解这个后大家就可以自己想合适的解决方案,目前我有两种解决方案:

方法一 :这个方案简单粗暴,我们市面上所有手机基本都会支持两种分辨率4:3 / 16:9,我所浏览的区域选取4:3方法如下:

  • 先设置好View宽高比是4:3
int windWidth = DensityUtils.getWindWidth(context);//我这里获取屏幕宽度
int mScreenWidth = windWidth;//预览View宽度
int mScreenHeight = windWidth / 3 * 4;//预览View高度
   /**从列表中选取合适的分辨率*/
   //拍摄尺寸
   Camera.Size picSize = getProperSize(pictureSizeList, ((float) height / width));
    if (null == picSize) {
      picSize = parameters.getPictureSize();
    }
    parameters.setPictureSize(picSize.width, picSize.height);
  //预览
   Camera.Size preSize = getProperSize(previewSizeList, ((float) height) / width);
    if (null != preSize) {
     parameters.setPreviewSize(preSize.width, preSize.height);
    }

    /**
     * 从列表中选取合适的分辨率
     */
    private Camera.Size getProperSize(List pictureSizeList, float screenRatio) {
//        Log.i(TAG, "screenRatio=" + screenRatio);
        Collections.sort(pictureSizeList, new SizeL2hComparator());
        Camera.Size result = null;
        for (Camera.Size size : pictureSizeList) {
            float currentRatio = ((float) size.width) / size.height;
            if (currentRatio == screenRatio && size.width >= 640) {//此处加了一个图片分辨率限制根据情况而定
//                LogsUtil.d("<-------->1>" + size.width + "<-------->" + size.height);
//                ToastUtils.toastShort("<-------->1>" + size.width + "<-------->" + size.height);
                result = size;
                break;
            }
        }

//由于传入比例已经做过限制下面代码可有可无
        if (null == result) {
            for (Camera.Size size : pictureSizeList) {
                float curRatio = ((float) size.width) / size.height;
                if (curRatio == 4f / 3 && size.width >= 640) {
//                    LogsUtil.d("<-------->2>" + size.width + "<-------->" + size.height);
//                    ToastUtils.toastShort("<-------->2>" + size.width + "<-------->" + size.height);
                    result = size;
                    break;
                }
            }
        }
        return result;
    }

    /**
     * 从小到大排序
     */
    private static class SizeL2hComparator implements Comparator {
        @Override
        public int compare(Camera.Size size1, Camera.Size size2) {
            if (size1.width > size2.width) {
                return -1;
            } else if (size1.width < size2.width) {
                return 1;
            }
            return 0;
        }
    }
以上方法可以解决预览变形拉伸问题,但是有4:3比例局限性;

方法二 :目前提供一下思路后续具体提供内容;
此方法就是算出需求比例最相近的尺寸使用,然后设置预览View宽高,如有其他好的方案希望可以共同学习一下;

你可能感兴趣的:(Android 自定义相机 Camera 预览变形拉伸问题)