2014-02-10 335 views
16

當使用takepicture方法混合OpenGL和Android相機的視圖以獲取圖像時,圖像會失真。我檢查並發現相機圖片被設置爲640X480,openGL視圖和相機預覽都設置爲1280x720。Android中的攝像頭,如何獲得最佳大小,預覽大小,圖片大小,視圖大小,圖像扭曲

所以我將相機圖片尺寸設置爲1280x720,結果非常完美。但是我無法在代碼中設置大小,因爲每個Android設備都會有所不同,並且每個設備的預覽大小和圖片大小都必須從支持的大小列表中進行選擇。

考慮到這裏有三個變量,活動佈局的屏幕大小,相機預覽大小和圖片大小,最佳做法是什麼?

最好是使用match_parent或fitXY作爲FrameLayout大小,並且只能使用兩個變量,預覽大小和圖片大小?

注意預覽尺寸和圖片尺寸中的幾個寬度和高度組合是相同的。例如預覽和圖片中都存在1280 x 720,是否會出現兩種尺寸都匹配的情況?

List<Size> previewSizes = mCamera.getParameters().getSupportedPreviewSizes(); 

List<Size> imageSizes = mCamera.getParameters().getSupportedPictureSizes(); 

// layout in the activity that the cameraView will placed in 
int layoutWidth = frameLayout.getWidth(); 
int layoutHeight = frameLayout.getHeight(); 

例如在測量後一個Android平板這些是使用佈局的ViewGroup的

大小在活性測量的結果的3個變量的結果

1280 x 736 

支持的圖片大小

320 x 240 
640 x 480 
1024 x 768 
1280 x 720 << best size in my example to use 
1280 x 768 
1280 x 920 
1600 x 1200 
2048 x 1536 
2560 x 1440 
2560 x 1536 
2560 x 1920 << native resolution of hardware camera 

支持預覽尺寸

176 x 144 
320 x 240 
352 x 288 
480 x 320 
480 x 368 
640 x 480 
800 x 480 
800 x 600 
864 x 480 
864 x 576 
960 x 540 
1280 x 720 << best size in my example to use 
1280 x 768 
1280 x 960 

回答

10

大多數情況下(但並非總是),圖片縱橫比與預覽縱橫比之間存在對應關係。您可以放心,至少其中一些是經典的4:3比例(例如640x480)。對16:9的支持也廣泛可用。

屏幕可能有不同的寬高比。要正確填充相機圖像,添加黑色邊距被廣泛接受(在YouTube中使用相同的方法)。或者,您可以剪裁相機圖像以填滿整個屏幕。

請注意,屏幕尺寸(如各種設備的技術規格中所報告的)並不總是可用於圖像顯示。例如,系統菜單和標題欄等可能會佔用屏幕房地產的份額。 沉浸式模式在某些設備上可用,其行爲取決於系統版本。您可能預期Android的未來發展,例如第二屏支持,將使遊戲更有趣

所以,回答您的具體問題:

是它最好使用match_parent或fitXY爲FrameLayout裏的大小,只有兩個變量,預覽大小和圖片尺寸? - no

是否總會出現兩種尺寸都匹配的情況? - ,但可能這個尺寸不是最優的。

即使你的相機支持不同的「寬」的畫面尺寸,1280×720 預覽2560×1440圖片可能是最好的比賽,無論是恰恰在16:9。通常情況下,小尺寸圖片的質量並不比預覽尺寸好,因此如果您真的需要1280x720,您可以選擇保存預覽圖片

如果你可以放棄takePicture(),你的應用程序將更加靈敏。

1

可能的算法:

1)得到輸出區域的縱橫比(=寬度/高度)

2)通過支持的尺寸迭代:

選擇最大的一個接近的縱橫比( + -5%,例如) 如果沒有任何接近或分辨率太低 - 只是使表面(您畫的幀)與最大支持的尺寸具有相同的縱橫比並將其居中視爲父視圖

還有,預覽尺寸有&圖片尺寸。如果你希望他們有相同的長寬比 - 那麼更好的選擇是使用第1選擇照片尺寸寬高比)這樣,你可能不得不中心的表面父視圖

希望幫助)

+0

這是什麼意思? '比例(=寬度/高度)2)' –

+1

長寬比=寬度/高度。什麼不明顯? – Sam

+0

我迷失在你的'2''你只是列舉了你的觀點。 ;) –

0

我認爲獲得preview size, picture size的最佳方法是設置相機以支持所有Android設備。這意味着您決定設置的preview size, picture size適合所有設備支持的流行格式,例如。是1280x720等

如下面的代碼,是前。我用什麼。

// start preview with new settings 
    try { 
     // set preview size and make any resize, rotate or 
     // reformatting changes here 
     Camera.Parameters parameters = mCamera.getParameters(); 

     for (Camera.Size size : parameters.getSupportedPictureSizes()) { 
      // 640 480 
      // 960 720 
      // 1024 768 
      // 1280 720 
      // 1600 1200 
      // 2560 1920 
      // 3264 2448 
      // 2048 1536 
      // 3264 1836 
      // 2048 1152 
      // 3264 2176 
      if (1600 <= size.width & size.width <= 1920) { 
       parameters.setPreviewSize(size.width, size.height); 
       parameters.setPictureSize(size.width, size.height); 
       break; 
      } 
     } 
     // Set parameters for camera 
     CustomCamera.mCamera.setParameters(parameters); 

     Camera.Size size = CustomCamera.mCamera.getParameters().getPictureSize(); 

     mCamera.setPreviewDisplay(mHolder); 
     mCamera.startPreview(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

Best size取決於相機MP。所以我認爲應該使用默認如果使用相機。

+0

嗨,夥計,烏爾代碼工作,但是,如果條件,我不得不用其他方式if if(size.width <= 800){ –

+0

嗨它工作正常,但當我使用預覽和結果中的圖像大小不同。它給了我更多的圖像,我抓住了。 –