Android摄像头-拍摄的照片与预览不一致
我对Android上的相机有一个问题,基本上当我用camera类拍照时,拍摄的输出图片实际上显示的比预览更多。最好的方式是将预览进行裁剪。我该如何解决这个问题 我已经在三星Galaxy S4、三星Galaxy S3、HTC One M8和Nexus One上运行了该应用程序,所有这些应用程序都展示了相同的问题。(全部运行Android 4.0 ICS) 活动中的摄像头预览是全屏的,没有操作栏,状态栏是隐藏的 我试图创建的相机是纵向的,所以我将displayOrientation设置为90 我用于确定预览大小和输出照片大小的代码如下(我认为问题最有可能出现在这里的某个地方):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 我用于
公共静态摄像头。大小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);
}
}