2014-01-25 140 views
3

我正在在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的示例程序。

回答

9

该算法不是最大的。

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进行定制,以选择更高的分辨率,而不是最佳匹配预览区域

+0

我是否需要使用CWAC相机库使用此功能的宽高比?当我试图使用你的函数而不是直接包含你的库时,我得到了SizeComparator的错误? –

+0

@Ramswaroop:不,欢迎您将其复制到您自己的项目中。 – CommonsWare

+0

我收到一条错误“SizeComparator()无法解析为类型”,我该如何解决? –