【问题标题】:Camera preview quality in Android is poorAndroid中的相机预览质量很差
【发布时间】:2014-02-16 17:23:24
【问题描述】:

我正在 Android 中制作相机应用,并使用以下函数来获取预览大小:

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;
        if (Math.abs(size.height - targetHeight) < minDiff) {
            optimalSize = size;
            minDiff = Math.abs(size.height - targetHeight);
        }
    }

    // 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;
}

我这样设置尺寸:

Size s = getOptimalPreviewSize(parameters.getSupportedPreviewSizes(), w, h);
parameters.setPreviewSize(s.width, s.height);

但问题是当我运行我的应用程序时,相机预览质量真的很差。如何获得与在手机上运行默认相机应用时相同的预览质量,换句话说,我希望在我的应用中获得高分辨率的相机预览。

我什至不确定预览大小是否是导致此问题的原因。

注意:获取预览大小的函数取自 Android Docs 的示例程序。

【问题讨论】:

    标签: android camera android-camera commonsware-cwac


    【解决方案1】:

    那个算法不是最好的。

    my CWAC-Camera library 中的默认算法现在是:

      public static Camera.Size getBestAspectPreviewSize(int displayOrientation,
                                                         int width,
                                                         int height,
                                                         Camera.Parameters parameters,
                                                         double closeEnough) {
        double targetRatio=(double)width / height;
        Camera.Size optimalSize=null;
        double minDiff=Double.MAX_VALUE;
    
        if (displayOrientation == 90 || displayOrientation == 270) {
          targetRatio=(double)height / width;
        }
    
        List<Size> sizes=parameters.getSupportedPreviewSizes();
    
        Collections.sort(sizes,
                         Collections.reverseOrder(new SizeComparator()));
    
        for (Size size : sizes) {
          double ratio=(double)size.width / size.height;
    
          if (Math.abs(ratio - targetRatio) < minDiff) {
            optimalSize=size;
            minDiff=Math.abs(ratio - targetRatio);
          }
    
          if (minDiff < closeEnough) {
            break;
          }
        }
    
        return(optimalSize);
      }
    

    这个:

    • 考虑纵向与横向

    • 从最高分辨率的预览开始,逐步向下进行

    • 可以通过closeEnough 进行定制,以选择更高分辨率而不是最佳匹配预览区域的纵横比

    【讨论】:

    • 我需要使用CWAC相机库来使用这个功能吗?当我尝试使用您的函数而不是我的函数而不包括您的库时,我收到 SizeComparator 错误?
    • @Ramswaroop:不,欢迎您将其复制到您自己的项目中。
    • 我收到错误“SizeComparator() 无法解析为类型”,我该如何解决?
    • 稍后在同一个文件中定义。复制整个类,而不仅仅是答案中显示的函数 (github.com/commonsguy/cwac-camera/blob/master/camera/src/com/…)。
    • @Ramswaroop:哦,对不起。正如fadden 所指出的,它是在他链接到的CameraUtils 类的底部定义的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-06
    • 2019-01-30
    • 2015-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多