Android中的相机预览质量很差

Android中的相机预览质量很差,android,camera,android-camera,commonsware-cwac,Android,Camera,Android Camera,Commonsware Cwac,我正在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 optimalSi

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

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


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

该算法不是最好的

中的默认算法现在是:

公共静态摄像头。大小getBestAspectPreviewSize(int-displayOrientation,
整数宽度,
整数高度,
摄像机,参数,
双倍(足够近){
双目标率=(双)宽度/高度;
照相机。大小优化大小=空;
double minDiff=double.MAX_值;
如果(显示方向==90 | |显示方向==270){
targetRatio=(双)高/宽;
}
列表大小=参数。getSupportedPreviewSizes();
集合。排序(大小,
Collections.reverseOrder(新的SizeComparator());
用于(尺寸:尺寸){
双倍比率=(双倍)size.width/size.height;
if(数学绝对值(比率-目标比率)
这:

  • 考虑肖像与风景

  • 从最高分辨率的预览开始,一直向下

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


我是否需要使用CWAC摄像头库才能使用此功能?当我尝试在不包含库的情况下直接使用您的函数而不是我的函数时,SizeComparator出现了一个错误?@Ramswaroop:不,欢迎您将其复制到您自己的项目中。我遇到了一个错误“SizeComparator()无法解析为类型”,我如何解决此问题?稍后将在同一文件中定义它。复制整个类,而不仅仅是答案()中显示的函数。@Ramswaroop:哦,很抱歉。正如法登指出的,它是在他链接的
CameraUtils
类的底部定义的。
Size s = getOptimalPreviewSize(parameters.getSupportedPreviewSizes(), w, h);
parameters.setPreviewSize(s.width, s.height);
  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);
  }