美文网首页
Android 自定义相机 Camera 预览变形拉伸问题

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

作者: SQ_孙琦 | 来源:发表于2018-07-01 22:34 被阅读0次
    前几天遇到一个需求拍摄省份证需要加一个框,需要自定义一个浏览页面,我就自定义了一下相机发现拍摄预览的时候图像是变形的,我就各种查找解决方案,自定义相机步骤我就不说了,直接说说我怎么解决的:

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

    List<Camera.Size> pictureSizeList = parameters.getSupportedPictureSizes();
    

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

    List<Camera.Size> 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<Camera.Size> 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<Camera.Size> {
            @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 预览变形拉伸问题

          本文链接:https://www.haomeiwen.com/subject/cqvhuftx.html