0

我试图创建一个使用 Camera2 API 的 Android 应用程序,作为我想要开发一个模块的功能的一部分,该模块可以保存 ImageReader 生成的多个图像,如下所示:

图片 image = reader.acquireLatestImage();

我收到以下异常:

IllegalStateException 当前获取的图像过多

如文档中所述: https://developer.android.com/reference/android/media/ImageReader#acquireLatestImage()

这是因为从 'acquireLatestImage' 返回的图像仍然属于 ImageReader 队列。

有没有办法分离从 'ImageReader' 返回的图像?
有没有办法复制图像,最好不要将其存储在磁盘上,这是一种资源消耗操作?

谢谢

4

1 回答 1

1

如果这是 YUV_420_888 图像,您可以复制每个平面 ByteBuffers 以无限期地保留数据。当然,这有点贵。

不幸的是,没有办法轻松地将 Image 从 ImageReader 中分离出来。Reader 在内部是一个循环缓冲区队列,因此删除 Image 需要 Reader 分配一个新图像来替换已删除的图像,这也有点昂贵。

可以通过使用ImageWriter.queueInputImage来完成,该 ImageWriter.queueInputImage连接到另一个具有与原始 ImageReader 相同配置的 ImageReader。当您从第一个 ImageReader 接收到图像 A 并且想要保留它时,可以将其排队到 ImageWriter 中,然后再次从第二个 ImageReader 获取图像句柄。当然,仍然需要将第二个阅读器上的 maxImages 设置得足够高,以考虑一次要保留的所有图像。当然,这相当麻烦,如果你不断地这样做,你会导致大量的内存重新分配,并且副本可能同样昂贵(并且在许多方面更简单)。

于 2020-06-17T22:03:48.427 回答