2014-06-07 101 views
0

我在安卓上遇到了相机问题,基本上当我使用相机类拍摄照片时,拍摄的输出图片实际上显示的不仅仅是预览。最好的方法是预览被裁剪。我将如何解决这个问题?安卓相机 - 拍摄的图片与预览不一致

我已经在三星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摄像头,并使用SimpleCameraHost没有变化。

任何帮助表示赞赏!

回答

1

我该如何解决这个问题?

如果您使用的是全出血预览,预览会在大多数情况下裁剪,作为CameraView的纵横比是不太可能匹配预览框的纵横比。

引用the documentation

CameraFragmentCameraView原始默认行为是显示整个预览 ,如由底层Camera API提供。由于纵横比为 ,预览帧可能与CameraView, 的纵横比不同,因此会产生“信箱”效果,其中背景将通过 在两侧展示一个轴。

新的默认行为是完全填充CameraView,在 裁去一些实际预览框的成本,所谓的“全出血预览” (从印刷媒体的世界偷一些术语)。

控制此行为:

  • 有从useFullBleedPreview()

  • CameraHost 回报truefalse或者,您SimpleCameraHost.BuilderuseFullBleedPreview() ,传递一个boolean值默认使用。

注意,这个库拍摄的照片和录像是由 useFullBleedPreview()影响。因此,如果useFullBleedPreview()返回true,则图片或视频可能在预览中可见的边缘上不包含 的附加内容。

+0

我做了useFullBleedPreview()返回false,但我仍然有同样的问题。你认为这与变焦有关吗?还是因为预览被裁剪而拍摄的照片不是? –

+0

@DavidXu:如果你的预览没有改变,那么有些事情是错误的 - 要么你没有正确禁用全面预览,要么在库中有一个错误。 – CommonsWare

+0

我在我的自定义CameraHost中覆盖useFullBleedPreview()以返回false,这不应该足够吗? –