2017-02-08 14 views
1

我有一個相機功能的應用程序。我正在使用Android Camera2 API。我發現,如果ImageReader被配置爲提供的JPEG一些Android設備(如的Nexus 6P的Nexus 5)更好地工作:如何爲我的Android相機應用程序選擇ImageReader緩衝區類型?

imageReader = ImageReader.NewInstance(width, height, ImageFormatType.Jpeg, 2); 

還有一些Android設備(如的Nexus 7 2013)更好地工作,如果ImageReader是配置來提供,也就是說,RGBA_8888

imageReader = ImageReader.NewInstance(width, height, (ImageFormatType)1 /* PixelFormat.RGBA_8888 */, 2); 

,工程與JPEG格式更好,如果我用吐出這個錯誤的設備RGBA_8888

[ImageReader_JNI] Producer output buffer format: 0x22, ImageReader configured format: 0x1 

與RGBA緩衝效果更好的設備吐出了這樣的警告,如果我使用JPEG文件:(它仍然有效,但它很慢,足以捕獲的圖像暗。)

[ImageReader_JNI] ImageReader_lockedImageSetup: Receiving JPEG in HAL_PIXEL_FORMAT_RGBA_8888 buffer. 

我必須做一些處理上如果我能夠將相機配置爲只是吐出某種位圖而不是JPEG,那麼最終它會更好,因爲我必須在繼續之前將JPEG轉換爲Bitmap

我該如何選擇傳遞給ImageReader的緩衝區類型?

+0

你的用例是什麼?單一快照(每秒捕獲次數不多)或連續捕獲(〜30fps)? –

+0

我有一個預覽表面,它會持續捕捉,直到您點擊拍照按鈕,此時它會單次捕捉到「ImageReader」。 –

回答

1

所有相機設備必須支持的唯一保證格式是YUV_420_888和JPEG;即使在這樣的情況下,LEGACY級別的設備通常僅支持最高分辨率下的JPEG(並且預覽分辨率下的YUV_420_888,通常不會高於1080p)。

您應該檢查設備的StreamConfigurationMap中支持的格式列表,而不是盲目地嘗試一些 - 而某些設備可能支持未在官方列表中列出的隨機格式,因此沒有太多保證他們將如何執行此操作。

由於LEGACY級別的設備假定當您需要JPEG時,您希望最大限度地保持拍攝質量,這需要更多的後處理而不僅僅是預覽幀;另外,LEGACY設備可以進行閃光測光和閃光。有限或更好的設備允許您控制後處理質量,因此它不受輸出格式限制,並且通常還支持更高分辨率的YUV捕獲。

如果你想得到廣泛的支持,我一般會遠離RGBA - 它與LEGACY設備的工作有點怪異,有限和更好的設備不太可能支持它。

當你說JPEG能夠工作,但速度足夠慢以致捕獲的圖像很暗時,我有點困惑 - 爲什麼慢度意味着黑暗的圖像?還是你的意思是圖像出來黑暗?

+0

在我的大部分設備上,捕捉到JPEG都很好。但是在這款Nexus 7 2013上,如果我捕捉到YUV,顏色很好,但是如果我捕捉到JPEG,有時會變黑。我原本以爲是停止重複預覽幀或某事的情況,但似乎並非如此。 –

相關問題