2013-10-08 118 views
5

我的應用程序使用表面支架打開相機。相機以默認預覽尺寸打開。在某些設備上,默認預覽尺寸會捕獲比屏幕上實際顯示的圖像更多的圖像。爲了避免這種情況,我開始自己設置預覽大小。標準是從可用的尺寸列表中選擇最接近屏幕寬度的預覽尺寸。Android相機預覽尺寸問題

這在大多數情況下運作良好。但我經常遇到幾個不喜歡我選擇的預覽尺寸的設備。

1)Nexus 4沒有捕捉到我選擇的預覽尺寸之一的圖像。 2)三星S 4沿拍攝的圖像提供線條(噪音)帶。

所以我想了解,如果我對標準做任何事情。這裏是我的問題: -

1)我使用表面支架打開相機。有沒有其他方法可以在我的應用程序中使用相機硬件。

2)我從可用尺寸列表中選擇預覽尺寸。在選擇任何尺寸之前有沒有具體的我應該尋找的?選擇大小的邏輯如下所示: -

private Camera.Size getBestPreviewSize(int width, int height) 
    { 
     List<Size> sizes = camera.getParameters().getSupportedPreviewSizes(); 
     if (sizes == null) return null; 

     Size optimalSize = null; 
     double minDiff = Double.MAX_VALUE; 

     int targetHeight = height; 
     int targetWidth = width; 

     int minWidthDiff = 0; 
     if (optimalSize == null) { 
      minDiff = Double.MAX_VALUE; 
      for (Size size : sizes) { 
       if (Math.abs(size.width - targetWidth) < minDiff) { 
        if(size.width > width) { 
         if (minWidthDiff == 0) { 
          minWidthDiff = size.width - width; 
          optimalSize = size; 
         } 
         else if (Math.abs(size.width - targetWidth) < minWidthDiff) { 
          minWidthDiff = size.width - width; 
          optimalSize = size; 

         } 
         minDiff = Math.abs(size.width - targetWidth); 
        } 
       } 
      } 
     } 

     if (optimalSize == null) { 
      minDiff = Double.MAX_VALUE; 
      for (Size size : sizes) { 
       if (Math.abs(size.height - targetHeight) < minDiff) { 
        optimalSize = size; 
        minDiff = Math.abs(size.height - targetHeight); 
       } 
      } 
     } 
     return optimalSize; 
    } 

對此的任何方向將真的有所幫助。

謝謝! 加甘

回答

10

當用相機工作,你有幾個不同的大小來考慮:

傳感器尺寸 相機具有由硬件決定的原始分辨率和寬高比。

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

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

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