美文网首页
Android Camera 预览图像被拉伸变形的解决方法

Android Camera 预览图像被拉伸变形的解决方法

作者: jdallen | 来源:发表于2019-07-30 18:41 被阅读0次

问题描述:
预览图像被拉伸变形

问题原因:
由于预览图像大小跟SurfaceView 大小不一致引起

解决方法:
获取系统支持的所有预览尺寸[getSupportedPictureSizes],然后再取一个比较接近的尺寸进行设置[setPreviewSize]

版本0(在小米8会模糊不清且变形)
private static Point getCameraResolution(Camera.Parameters parameters, Point screenResolution) {

        System.out.println("pingmu  " + screenResolution.x + "  " + screenResolution.y);
        List<Size> list = parameters.getSupportedPreviewSizes();
        Collections.sort(list, new Comparator<Size>() {

            @Override
            public int compare(Size lhs, Size rhs) {
                if (lhs.width - rhs.width == 0) {
                    return lhs.height - rhs.height;

                }

                return lhs.width - rhs.width;
            }
        });
        for (Size size : list) {
            System.out.println(size.width + "   " + size.height);
            if (Math.abs(size.width * 1.0 / size.height - 1.0 * screenResolution.y / screenResolution.x) < 0.1) {

                return new Point(size.width, size.height);
            }
        }
        return new Point(list.get(0).width, list.get(0).height);

//    String previewSizeValueString = parameters.get("preview-size-values");
//    // saw this on Xperia
//    if (previewSizeValueString == null) {
//      previewSizeValueString = parameters.get("preview-size-value");
//    }
//
//    Point cameraResolution = null;
//
//    if (previewSizeValueString != null) {
//      Log.d(TAG, "preview-size-values parameter: " + previewSizeValueString);
//      cameraResolution = findBestPreviewSizeValue(previewSizeValueString, screenResolution);
//    }
//
//    if (cameraResolution == null) {
//      // Ensure that the camera resolution is a multiple of 8, as the screen may not be.
//      cameraResolution = new Point(
//          (screenResolution.x >> 3) << 3,
//          (screenResolution.y >> 3) << 3);
//    }
//
//    return cameraResolution;
    }
版本1(有点变形,清晰明了,但扫描时不灵敏)
 private static Point getCameraResolution(Camera.Parameters parameters, Point screenResolution) {
        List<Camera.Size> sizes = parameters.getSupportedPreviewSizes();
        int w = screenResolution.x;
        int h = screenResolution.y;
        final double ASPECT_TOLERANCE = 0.1;
        double targetRatio = (double) h / w;
        Camera.Size optimalSize = null;
        double minDiff = Double.MAX_VALUE;

        int targetHeight = h;

        for (Camera.Size size : sizes) {
            double ratio = (double) size.width / size.height;
            if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue;
            if (Math.abs(size.height - targetHeight) < minDiff) {
                optimalSize = size;
                minDiff = Math.abs(size.height - targetHeight);
            }
        }

        if (optimalSize == null) {
            minDiff = Double.MAX_VALUE;
            for (Camera.Size size : sizes) {
                if (Math.abs(size.height - targetHeight) < minDiff) {
                    optimalSize = size;
                    minDiff = Math.abs(size.height - targetHeight);
                }
            }
        }
        if(null == optimalSize){
            return new Point(sizes.get(0).width, sizes.get(0).height);
        }
        return new Point(optimalSize.width, optimalSize.height);
    }
版本2(暂时测试完美)
 private Point getCameraResolution(Camera.Parameters parameters, Point screenResolution){
        float tmp = 0f;
        float mindiff = 100f;
        float x_d_y = (float)screenResolution.x / (float)screenResolution.y;
        Size best = null;
        List<Size> supportedPreviewSizes = parameters.getSupportedPreviewSizes();
        for(Size s : supportedPreviewSizes){
            tmp = Math.abs(((float)s.height/(float)s.width)-x_d_y);
            if(tmp<mindiff){
                mindiff = tmp;
                best = s;
            }
        }
        return new Point(best.width, best.height);
    }

相关文章

网友评论

      本文标题:Android Camera 预览图像被拉伸变形的解决方法

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