Android摄像头-拍摄的照片与预览不一致

Android摄像头-拍摄的照片与预览不一致,android,camera,commonsware-cwac,Android,Camera,Commonsware Cwac,我对Android上的相机有一个问题,基本上当我用camera类拍照时,拍摄的输出图片实际上显示的比预览更多。最好的方式是将预览进行裁剪。我该如何解决这个问题 我已经在三星Galaxy S4、三星Galaxy S3、HTC One M8和Nexus One上运行了该应用程序,所有这些应用程序都展示了相同的问题。(全部运行Android 4.0 ICS) 活动中的摄像头预览是全屏的,没有操作栏,状态栏是隐藏的 我试图创建的相机是纵向的,所以我将displayOrientation设置为90 我用于

我对Android上的相机有一个问题,基本上当我用camera类拍照时,拍摄的输出图片实际上显示的比预览更多。最好的方式是将预览进行裁剪。我该如何解决这个问题

我已经在三星Galaxy S4、三星Galaxy S3、HTC One M8和Nexus One上运行了该应用程序,所有这些应用程序都展示了相同的问题。(全部运行Android 4.0 ICS)

活动中的摄像头预览是全屏的,没有操作栏,状态栏是隐藏的

我试图创建的相机是纵向的,所以我将displayOrientation设置为90

我用于确定预览大小和输出照片大小的代码如下(我认为问题最有可能出现在这里的某个地方):

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

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);
}
}
私有静态类SizeComparator实现
比较器{
@凌驾
公共整数比较(大小lhs,大小rhs){
int left=左侧宽度*左侧高度;
int right=rhs.width*rhs.height;
if(左<右){
返回(-1);
}
else if(左>右){
申报表(1);
}
返回(0);
}
}
这是使用cwac摄像头和SimpleCameraHost,没有任何更改

感谢您的帮助

我该如何解决这个问题

如果使用全出血预览,在大多数情况下,预览将被裁剪,因为
CameraView
的纵横比不太可能与预览帧的纵横比匹配

引述:

CameraFragment
CameraView
的原始默认行为是显示整个 预览,由底层
摄像机
API提供。由于
预览帧可能不同于
CameraView
的纵横比, 这将产生一种“信箱”效果,背景将显示在屏幕上 两边各有一个轴

新的默认行为是完全填充
CameraView
,代价是 裁剪掉一些实际的预览帧,即所谓的“全出血预览” (从印刷媒体界窃取了一些术语)

要控制此行为,请执行以下操作:

  • 让您的
    CameraHost
    usefulbleedepreview()返回
    true
    false

  • 或者,调用
    useFullBleedPreview()
    SimpleCameraHost.Builder
    上,传入一个默认使用的
    布尔值

请注意,此库拍摄的图片和视频不受
useFullBleedPreview()
。因此,如果
useFullBleedPreview()
返回
true
,则 图片或视频的边缘可能包含未显示的其他内容 在预览中可见


我已将useFullBleedPreview()返回值设为false,但仍然存在相同的问题。你认为这和zoom有关吗?或者是因为预览被裁剪,而拍摄的照片没有被裁剪?@DavidXu:如果预览没有更改,那么就出问题了——要么你没有正确禁用全血预览,要么库中存在错误。我在自定义CameraHost中覆盖了useFullBleedPreview()以返回false,这还不够吗?@DavidXu:应该够了。您的预览是否显示为“字母框”(即,白色条在一侧)?不,不是。屏幕上完全充满了相机预览。在配备4.0 ICS的Galaxy S4上运行。
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);
}
}