我有一个带摄像功能的应用程序。我正在使用Android Camera2 API。我发现如果将ImageReader
配置为提供JPEG,某些Android设备(例如Nexus 6p,Nexus 5)的效果会更好:
imageReader = ImageReader.NewInstance(width, height, ImageFormatType.Jpeg, 2);
如果将ImageReader
配置为提供RGBA_8888
:
imageReader = ImageReader.NewInstance(width, height, (ImageFormatType)1 /* PixelFormat.RGBA_8888 */, 2);
如果我使用RGBA_8888
:
[ImageReader_JNI] Producer output buffer format: 0x22, ImageReader configured format: 0x1
如果我使用JPEG,那么使用RGBA缓冲区工作得更好的设备会发出此警告:(它仍然有效,但它的速度足够快,以至于拍摄的图像很暗。)
[ImageReader_JNI] ImageReader_lockedImageSetup: Receiving JPEG in HAL_PIXEL_FORMAT_RGBA_8888 buffer.
我必须对我得到的东西进行一些处理,所以最终如果我可以配置相机只是吐出某种位图而不是JPEG,那会更好,因为我必须将JPEG转换为{ {1}}继续之前。
我应该如何选择要传递给Bitmap
的缓冲区类型?
答案 0 :(得分:1)
所有相机设备必须支持的唯一保证格式是YUV_420_888和JPEG;即便如此,LEGACY级设备通常仅支持最大分辨率的JPEG(预览分辨率为YUV_420_888,通常不高于1080p)。
您应该检查设备StreamConfigurationMap中支持的格式列表,而不是盲目地尝试一些 - 而某些设备可能支持其官方列表中未列出的随机格式,那里有他们不会很好地保证他们会这么做。
JPEG捕获往往较慢,因为LEGACY级设备假设当您需要JPEG时,您希望获得最大的捕获质量,这比仅仅预览帧需要更多的后处理;另外,LEGACY设备可以进行闪光测光和点火。有限或更好的设备允许您控制后处理质量,因此它不依赖于输出格式,并且通常也支持更高的YUV捕获分辨率。
如果您需要广泛的支持,我通常会远离RGBA - 它与LEGACY设备一起工作有点怪癖,有限和更好的设备不太可能支持它。
当你说JPEG有效,但速度足够快以至于拍摄的图像很暗时,我有点困惑 - 为什么慢度意味着一个黑暗的图像?或者你只是说图像是黑暗的?