2017-02-08 107 views
0

在使用相機的應用程序中,我需要顯示相機的預覽,我可以通過獲取所有支持的預覽尺寸來設置預覽尺寸,並找到最好的。我是否也應該爲相機設定最佳的照片尺寸?如果是這樣,預覽尺寸和圖片尺寸有什麼區別?安卓相機的預覽尺寸和圖片尺寸之間的區別

而且目前我用的是下面找到最好的預覽大小

int minDiff = Integer.MAX_VALUE; 
for (SizePair sizePair : validPreviewSizes) { 
    Size size = sizePair.previewSize(); 
    int diff = 
     Math.abs(size.getWidth() - desiredWidth) + Math.abs(size.getHeight() - desiredHeight); 
    if (diff < minDiff) { 
    selectedPair = sizePair; 
    minDiff = diff; 
    } 
} 

使用這種方法給出了一些手機錯誤預覽大小。有人可以提出一個更好的邏輯來獲得最佳preivew大小?

回答

5

圖片尺寸這是您告訴相機拍照時產生的圖像尺寸。如果它與原始分辨率具有相同的縱橫比,那麼它將直接從該分辨率縮放。如果寬高比不同,則會從原始大小裁剪。根據我的經驗,getSupportedPictureSizes返回的最大尺寸是相機的原始分辨率。

預覽大小這是顯示在屏幕上的圖像預覽的大小。它可能與原始尺寸或圖片尺寸不同,可能會導致進一步的裁剪

要獲得屏幕上顯示的內容與拍攝照片時生成的圖像之間最接近的匹配,請嘗試選擇預覽尺寸的縱橫比儘可能接近您選擇的圖片尺寸的縱橫比。我通常會盡量使它們儘可能地接近原始大小。

也請您查看this link

1

解釋拉利特相機照片的尺寸和預覽大小的區別。您可以嘗試使用此方法來獲取與設備屏幕大小相關的最佳尺寸。

private Camera.Size getOptimalSize(Camera.Parameters params, int w, int h) { 

    final double ASPECT_TH = .2; // Threshold between camera supported ratio and screen ratio. 
    double minDiff = Double.MAX_VALUE; // Threshold of difference between screen height and camera supported height. 
    double targetRatio = 0; 
    int targetHeight = h; 
    double ratio; 
    Camera.Size optimalSize = null; 

    // check if the orientation is portrait or landscape to change aspect ratio. 
    if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { 
     targetRatio = (double) h/(double) w; 
    } else if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { 
     targetRatio = (double) w/(double) h; 
    } 

    // loop through all supported preview sizes to set best display ratio. 
    for (Camera.Size s : params.getSupportedPreviewSizes()) { 

     ratio = (double) s.width/(double) s.height; 
     if (Math.abs(ratio - targetRatio) <= ASPECT_TH) { 

      if (Math.abs(targetHeight - s.height) < minDiff) { 
       optimalSize = s; 
       minDiff = Math.abs(targetHeight - s.height); 
      } 
     } 
    } 
    return optimalSize; 
}