2014-06-07 149 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,這不應該足夠嗎? –