安卓系统中相机预览质量较差

5
我正在开发一款安卓相机应用,并使用以下函数获取预览大小:
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文档中的示例程序。

1个回答

11

那个算法并不是最好的。

我的CWAC-Camera库中的默认算法现在是:

  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错误。 - Ram Patra
@Ramswaroop:不,你可以放心地将它复制到你自己的项目中。 - CommonsWare
2
它在同一个文件中稍后定义。将整个类复制进去,而不仅仅是答案中显示的函数(https://github.com/commonsguy/cwac-camera/blob/master/camera/src/com/commonsware/cwac/camera/CameraUtils.java)。 - fadden
@Ramswaroop:哦,对不起。正如fadden指出的那样,它在他链接到的CameraUtils类的底部被定义。 - CommonsWare
@Ramswaroop:首先,确定您的预览分辨率是多少。如果分辨率足够高,而且预览不符合您的标准,我不知道该怎么告诉您。但是,如果您的分辨率非常低,可以尝试更高的closeEnough值,或者确定算法为什么没有选择更高的分辨率。 - CommonsWare
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接