????acquireLatestImage()
????从ImageReader的队列中获取最新的Image ,删除旧images 。 如果没有新图像可用,则返回null 。如果已经close了,那么将不会是最新的数据图像。对于大多情况可以使用acquireNextImage(),它更加适合处理实时数据.。在使用这个方法读取图片的时候,要注意maxImages不能小于2,从字面上和上面的知识我们了解到它是获取一张,丢弃一张。如果小于2的话可能会导致预期丢弃失败
????acquireNextImage()
????从ImageReader的队列中获取下一个Image。 如果没有新图像可用,则返回null 。注意皮球,警告:考虑使用acquireLatestImage() ,因为它会自动释放较旧的图像,并允许运行较慢的处理最新的帧。 建议在批处理/后台处理中使用acquireNextImage() 。错误地使用此功能可能会导致图像出现延迟不断增加,然后是完全失速,看起来没有新的图像出现。
????Image
???? 类注释:提到这个类,对于我们来说有些陌生,其实我们是使用过它的。回忆一下调用系统相机拍照,是不是游戏记忆了。可以查看文章底部的参考链接。Image是一个完整的多媒体图像缓冲区,如:MediaCodec、camera2。surfaceview 大小可以通过一个或多个ByteBuffer高效直接的访问,每一个缓冲区都封装在Plane这个平面布中。这里直接获取的是缓存流,这个和Bitmap有直接的区别。Image通常是由硬件直接生成或使用的,因此它们是整个系统的共享资源,在不使用的时候,应该尽快的关闭。不能直接作为UI资源。在使用ImageReader从各种媒体源读出图像时,超过getMaxImages范围,不关闭旧的Image那么将阻止新Image的可用性。往往抛出IllegalStateException。这里不清楚这个一或多具体指的什么。初步估计是多张Image,理由是,在ImageReader中可以设置mMaxImages,而且也建议是2张。通从被人的代码中猜测的,代码如下:
img = imageReader.acquireLatestImage();
if (img != null) {
Image.Plane[] planes = img.getPlanes();
if (planes[0].getBuffer() == null) {
return;
}
....
}
????对于方法的话基本都是抽象方法。也不太好翻译,主要是晓不到如何下手。把几个公共的方法和获取流的方法记录一下。
????setTimestamp( )
????getCropRect( )
????获取关联的裁剪矩形。
????setCropRect( )
????设置相关联的裁剪矩形。
????getPlanes( )
????获取此图像的像素平面阵列。 平面的数量由图像的格式决定。 如果图像格式为PRIVATE ,则应用程序将获得一个空数组,因为图像像素数据不可直接访问。 应用程序可以通过调用getFormat()来检查图像格式。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-58101-5.html