【问题标题】:Detach Image produced from ImageReader分离从 ImageReader 生成的图像
【发布时间】:2020-06-18 06:03:48
【问题描述】:

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

Image image = reader.acquireLatestImage();

我收到以下异常:

IllegalStateException 当前获取的图像过多

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

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

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

谢谢

【问题讨论】:

    标签: android image image-reader


    【解决方案1】:

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

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

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

    【讨论】:

    • 现在我只是将队列大小定义为更大的一个图像,并将其作为(最终)全局变量保存在不同的类中。我知道它不是最佳实践解决方案,但它现在有效,直到我实施另一个解决方案。感谢您的努力。
    • 对于少量图像来说,增加队列大小是完全合理的——除非需要,否则阅读器不会分配那么多图像,如果您确实需要保留图像,则没有在某个地方需要内存的方式。
    猜你喜欢
    • 2015-06-04
    • 1970-01-01
    • 1970-01-01
    • 2017-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    相关资源
    最近更新 更多