Android相机 - 拍摄的图片与预览不一致

时间:2014-06-07 14:47:31

标签: android camera commonsware-cwac

我在Android上遇到相机问题,基本上当我用Camera类拍照时,拍摄的输出图像实际上显示的不仅仅是预览。放置它的最好方法是预览被裁剪。我该如何解决这个问题?

我在三星Galaxy S4,三星Galaxy S3,HTC One M8和Nexus One上运行应用程序,并且都展示了同样的问题。 (全部运行Android 4.0 ICS)

在没有操作栏且状态栏隐藏的活动中,相机预览全屏显示。

我正在尝试创建的相机是肖像,所以我将displayOrientation设置为90.

我用来确定预览尺寸和输出照片尺寸的代码如下(我相信问题最有可能出现在这里):

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


 public static Camera.Size getLargestPictureSize(CameraHost host,
                                              Camera.Parameters parameters,
                                              boolean enforceProfile) {
Camera.Size result=null;

for (Camera.Size size : parameters.getSupportedPictureSizes()) {

  // android.util.Log.d("CWAC-Camera",
  // String.format("%d x %d", size.width, size.height));

  if (!enforceProfile
      || (size.height <= host.getDeviceProfile()
                             .getMaxPictureHeight() && size.height >= host.getDeviceProfile()
                                                                          .getMinPictureHeight())) {
    if (result == null) {
      result=size;
    }
    else {
      int resultArea=result.width * result.height;
      int newArea=size.width * size.height;

      if (newArea > resultArea) {
        result=size;
      }
    }
  }
}

if (result == null && enforceProfile) {
  result=getLargestPictureSize(host, parameters, false);
}

return(result);
 }

尺寸比较器类:

private static class SizeComparator implements
  Comparator<Camera.Size> {
@Override
public int compare(Size lhs, Size rhs) {
  int left=lhs.width * lhs.height;
  int right=rhs.width * rhs.height;

  if (left < right) {
    return(-1);
  }
  else if (left > right) {
    return(1);
  }

  return(0);
}
}

这是使用cwac-camera并使用SimpleCameraHost而不做任何更改。

感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

  

我该如何解决这个问题?

如果您使用的是全出血预览,则在大多数情况下都会裁剪预览,因为CameraView的宽高比不太可能与预览帧的宽高比相匹配。

引用the documentation

  

CameraFragmentCameraView的原始默认行为是显示整个行为   预览,由基础Camera API提供。由于纵横比   预览帧可能与CameraView的宽高比不同,   这导致了一个&#34;信箱&#34;效果,背景将显示在哪里   两侧有一个轴。

     

新的默认行为是完全填充CameraView,代价是。{   裁剪一些实际的预览框架,即所谓的&#34;全出血预览&#34;   (从印刷媒体世界窃取一些术语)。

     

要控制此行为:

     
      
  • 拥有CameraHost   从true

  • 返回falseuseFullBleedPreview()   
  • 或致电useFullBleedPreview()   在SimpleCameraHost.Builder上,默认情况下传递boolean值。

  •   
     

请注意,此库拍摄的照片和视频不受影响   useFullBleedPreview()。因此,如果useFullBleedPreview()返回true,那么。{   图片或视频可能包含边缘上没有的其他内容   在预览中可见。