2011-11-03 68 views
11

我正在嘗試檢索可用的相機圖片尺寸,因此我可以將相機調整爲我喜歡的圖片分辨率。安卓相機支持的圖片尺寸

要檢索我用下面的代碼Android相機尺寸:

camera=Camera.open(); 
Parameters params = camera.getParameters(); 
List sizes = params.getSupportedPictureSizes(); 
for (int i=0;i<sizes.size();i++){ 
    Log.i("PictureSize", "Supported Size: " +sizes.get(i));   
} 

這給了我下面的輸出,這我不知道如何翻譯成規模。

"Supported size: [email protected]" 
"Supported size: [email protected]" 
"Supported size: [email protected]" 
"Supported size: [email protected]" 
"Supported size: [email protected]" 
"Supported size: [email protected]" 

如果有人能幫助我理解輸出,它會幫助我很多,謝謝!

編輯:我最終通過執行以下解決我的問題:

camera=Camera.open(); 
Parameters params = camera.getParameters(); 
List sizes = params.getSupportedPictureSizes(); 
Camera.Size result = null; 
    for (int i=0;i<sizes.size();i++){ 
     result = (Size) sizes.get(i); 
     Log.i("PictureSize", "Supported Size. Width: " + result.width + "height : " + result.height); 
    } 

回答

11

getSupportedPictureSizes()返回Camera.SizeList對象。 Camera.Sizeheightwidth數據成員告訴你支持的圖片大小的高度和寬度。

Here is a sample project它使用相關的getSupportedPreviewSizes()來查找最大面積小於SurfaceView大小的預覽大小。

+0

謝謝解決我現在的問題。不知何故,我錯過了通過調用getSupportedPictureSizes()來獲取Camera.Size對象。該示例項目非常棒。 –

+0

CommonsWare,在你的項目中,你沒有設置圖片大小 - 是否有必要設置我想知道的圖片大小?因爲它給了我很大的麻煩,支持各種不同的設備,並保持預覽和圖片大小同步,並且由於高寬比而不會讓它們變得太小。 – AgentKnopf

+0

@Zainodis:「在您的項目中,您沒有設置圖片大小」 - 該特定樣本不拍照。它只設置預覽。 「甚至有必要設置我想知道的圖片大小?」 - 有可能是默認的,但我總是設置一個。「因爲它給了我嚴重的麻煩,支持各種各樣的設備,並保持預覽和圖片大小同步,並且不會因縱橫比而讓它們變得太小」 - 我感到你的痛苦,因爲我處理了一些在我的CWAC-Camera幫助程序庫中。 – CommonsWare

5
Camera camera = Camera.open(); 
Parameters params = camera.getParameters(); 
List sizes = params.getSupportedPictureSizes(); 
for (int i=0;i<sizes.size();i++) { 
    Log.i("PictureSize", "Supported Size: " +sizes.get(i).width + "height : " + sizes.get(i).height);  
} 

你必須採取高度和寬度從一個尺寸對象

+0

我無法完全按照這種方式工作。我最終做了以下改爲:聲明一個攝像頭大小變量,然後用它來保存每個對象,並從中獲取寬度/高度。不太清楚爲什麼我不能像你所建議的那樣執行它。 –

+0

@krishnabhadra我想知道列表大小(sizes.get(0))的第一個元素是相機給出的最佳圖片大小嗎?或只是一個隨機好的照片大小相機給出? –

0

這是我落得這樣做。由於params.getSupportedPictureSizes()返回Camera.Size類型的列表的方法,這是很容易做到這一點:

 List<Camera.Size> sizes = p.getSupportedPictureSizes(); 

     //searches for good picture quality 
     for(Camera.Size dimens : sizes){ 
      if(dimens.width <= 1024 && dimens.height <= 768){ 
       Debug.WriteLine("Width: " + dimens.width + " Height: " + dimens.height); 
       return dimens; 
      } 
     } 

     Debug.WriteLine("Width: " + sizes.get(sizes.size()-1).width + " Height: " + sizes.get(sizes.size()-1).height); 
     //returns the smallest camera size if worst comes to worst 
     return p.getSupportedPictureSizes().get(sizes.size()-1); 

你可以得到一個List<Camera.Size>並遍歷它像任何其他列表。 Camera.Size對象具有widthheight屬性。

以這種方式聲明List可能比在表單中的每個元素在循環內鍵入Camera.Size要好。

在我的設備上,如果我查看sizes.get(0),它將具有最高分辨率,而sizes.get(sizes.size()-1)具有最低分辨率。但是,我不確定所有設備是否都是如此。任何人都有這方面的見解?

+1

在我的Samsung Galaxy Note II上,最小尺寸是索引0,正在上升。所有設備都不一樣。 –

+0

是的,三星手機很難用於相機。還有其他一些問題,比如圖像翻轉(沒有exif界面)。我見過人們試圖檢測設備是否是三星設備,並基於此運行功能。真是痛苦,我說得對嗎? – Nlinscott

+0

是的,非常傷心。特別是寫作驅動程序應該是操作系統的一部分。 –

1

下面是如何搜索超出您的最大尺寸(1024 * 768)的大小的示例。

   List<Camera.Size> sizes = parameters.getSupportedPictureSizes(); 
       //searches for good picture quality 
       Camera.Size bestDimens = null; 
       for(Camera.Size dimens : sizes){ 
        if(dimens.width <= 1024 && dimens.height <= 768){ 
         if (bestDimens == null || (dimens.width > bestDimens.width && dimens.height > bestDimens.height)) { 
          bestDimens = dimens; 
         } 
        } 
       } 
       parameters.setPictureSize(bestDimens.width, bestDimens.height); 
       camera.setParameters(parameters);