- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个带有相机功能的应用程序。我正在使用 Android Camera2 API。我发现如果将 ImageReader
配置为提供 JPEG,某些 Android 设备(例如 Nexus 6p、Nexus 5)会工作得更好:
imageReader = ImageReader.NewInstance(width, height, ImageFormatType.Jpeg, 2);
如果 ImageReader
配置为提供,例如 RGBA_8888
,一些 Android 设备(例如 Nexus 7 2013)工作得更好:
imageReader = ImageReader.NewInstance(width, height, (ImageFormatType)1 /* PixelFormat.RGBA_8888 */, 2);
如果我使用 RGBA_8888
,则与 JPEG 配合得更好的设备会出现此错误:
[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 转换为 位图
,然后继续。
我应该如何选择要传递给 ImageReader
的缓冲区类型?
最佳答案
所有相机设备必须支持的唯一保证格式是 YUV_420_888 和 JPEG;即便如此,LEGACY 级别的设备通常仅支持最大分辨率的 JPEG(以及预览分辨率下的 YUV_420_888,通常不高于 1080p)。
您应该在设备的 StreamConfigurationMap 中检查支持的格式列表而不是盲目地尝试一些 - 虽然某些设备可能支持未在其官方列表中列出的随机格式,但并不能保证它们的效果如何。
JPEG 捕获往往较慢,因为 LEGACY 级别的设备假定当您需要 JPEG 时,您需要最大的静态捕获质量,这需要比预览帧更多的后期处理;另外,LEGACY 设备可能会进行闪光测光和闪光。 LIMITED 或更好的设备允许您控制后处理质量,因此它不受输出格式的限制,并且通常还支持更高分辨率的 YUV 捕获。
如果你想要广泛的支持,我通常会远离 RGBA - 它与 LEGACY 设备一起工作有点怪癖,LIMITED 和更好的设备不太可能支持它。
当您说 JPEG 可以工作,但速度太慢以至于捕获的图像很暗时,我有点困惑 - 为什么慢意味着图像很暗?还是您的意思是图像变暗?
关于android - 如何为我的 Android 相机应用程序选择 ImageReader 缓冲区类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42103187/
我是一名优秀的程序员,十分优秀!