Most visited

Recently visited

Added in API level 19

ImageReader

public class ImageReader
extends Object implements AutoCloseable

java.lang.Object
   ↳ android.media.ImageReader


ImageReader类允许直接应用程序访问渲染到 Surface图像数据

几款Android媒体API类接受面对象为目标,以渲染,包括MediaPlayerMediaCodecCameraDeviceImageWriterRenderScript Allocations 可以用于每个源的图像大小和格式各不相同,应在特定API的文档中进行检查。

图像数据封装在Image对象中,并且可以同时访问多个此类对象,最多可达到maxImages构造函数参数指定的数量。 通过Surface发送到ImageReader的新图像排队,直到通过acquireLatestImage()acquireNextImage()呼叫访问。 由于内存限制,如果ImageReader没有以等于生产速率的速率获取和释放图像,则图像源将最终在尝试渲染到Surface时停止或放下图像。

Summary

Nested classes

interface ImageReader.OnImageAvailableListener

回叫界面用于通知新图像可用。

Public methods

Image acquireLatestImage()

从ImageReader的队列中获取最新的 Image ,删除旧的 images

Image acquireNextImage()

从ImageReader的队列中获取下一个Image。

void close()

释放与此ImageReader相关的所有资源。

int getHeight()

默认高度为 Images ,以像素为单位。

int getImageFormat()

image format的默认 Images

int getMaxImages()

任何时候可从ImageReader获取的图像的最大数量(例如, acquireNextImage() )。

Surface getSurface()

获得 Surface ,可用于生产 Images这个 ImageReader

int getWidth()

默认宽度为 Images ,以像素为单位。

static ImageReader newInstance(int width, int height, int format, int maxImages)

为所需大小和格式的图像创建一个新阅读器。

void setOnImageAvailableListener(ImageReader.OnImageAvailableListener listener, Handler handler)

当ImageReader中有新图像可用时,注册一个侦听器以供调用。

Protected methods

void finalize()

当垃圾收集确定没有更多对该对象的引用时,由对象上的垃圾回收器调用。

Inherited methods

From class java.lang.Object
From interface java.lang.AutoCloseable

Public methods

acquireLatestImage

Added in API level 19
Image acquireLatestImage ()

从ImageReader的队列中获取最新的Image ,删除旧的images 如果没有新图像可用,则返回null

此操作将从ImageReader中获取所有可能的图像,但close()所有不是最新的图像。 建议在大多数使用情况下使用acquireNextImage()以上的功能,因为它更适合实时处理。

需要注意的是maxImages应该是至少2 acquireLatestImage()是任何不同于acquireNextImage() -丢弃所有,但最最新Image需要临时采集两个Images一次。 或者更一般地说,使用少于两幅保证金的图像呼叫acquireLatestImage() ,即(maxImages - currentAcquiredImages < 2)将不会按预期丢弃。

此操作将抛出一个失败IllegalStateException如果maxImages已经获得与acquireLatestImage()或者acquireNextImage() 特别的序列acquireLatestImage()调用大于getMaxImages()而不调用close()在两者之间将耗尽队列。 在这个时候,将会抛出IllegalStateException直到更多图像与close()一起发布。

Returns
Image latest frame of image data, or null if no image data is available.
Throws
IllegalStateException if too many images are currently acquired

acquireNextImage

Added in API level 19
Image acquireNextImage ()

从ImageReader的队列中获取下一个Image。 如果没有新图像可用,则返回null

警告:考虑使用acquireLatestImage() ,因为它会自动释放较旧的图像,并允许运行较慢的处理例程赶上最新的帧。 批处理/后台处理建议使用acquireNextImage() 错误地使用此功能可能会导致图像出现延迟不断增加,然后是完全失速,看起来不会出现新图像。

此操作将抛出一个失败IllegalStateException如果maxImages已经获得与acquireNextImage()或者acquireLatestImage() 特别是一个acquireNextImage()acquireLatestImage()调用的序列大于maxImages而不调用close()中间将耗尽底层队列。 在这个时候, IllegalStateException将被抛出,直到更多图像与close()一起发布。

Returns
Image a new frame of image data, or null if no image data is available.
Throws
IllegalStateException if maxImages images are currently acquired

也可以看看:

close

Added in API level 19
void close ()

释放与此ImageReader相关的所有资源。

调用此方法后,此ImageReader无法使用。 调用此ImageReader的和先前提供的图像的任何方法acquireNextImage()或者acquireLatestImage()将导致IllegalStateException ,并尝试从读取ByteBuffers由先前的返回Plane#getBuffer电话将有不确定的行为。

getHeight

Added in API level 19
int getHeight ()

默认高度为 Images (以像素为单位)。

生产者将缓冲区发送到此ImageReader的Surface可以覆盖高度。 如果是这样,图像的实际高度可以使用getHeight()找到。

Returns
int the expected height of an Image

getImageFormat

Added in API level 19
int getImageFormat ()

image format的默认 Images

如果默认颜色格式允许,某些颜色格式可能会被生产者将缓冲区发送到此ImageReader的表面。 的ImageReader保证所有Images从ImageReader的收购(例如,与acquireNextImage() ),将有一个“兼容”格式,以什么规定newInstance(int, int, int, int) 截至目前,每种格式只与自身兼容。 图像的实际格式可以使用getFormat()找到。

Returns
int the expected format of an Image

也可以看看:

getMaxImages

Added in API level 19
int getMaxImages ()

任何时候可以从ImageReader获取的图像的最大数量(例如, acquireNextImage() )。

图像被ImageReader中的函数返回后被认为是获取的,直到图像 closed才将图像释放回ImageReader。

试图并发获取超过maxImages将导致IllegalStateException函数抛出IllegalStateException 此外,尽管ImageReader用户已经获取了最大图像数量,但生成器排入其他图像的操作可能会停止,直到至少有一个图像被释放。

Returns
int Maximum number of images for this ImageReader.

也可以看看:

getSurface

Added in API level 19
Surface getSurface ()

获得 Surface ,可用于生产 Images这个 ImageReader

在将有效的图像数据渲染到此SurfaceacquireNextImage()方法将返回null 只有一个源可以同时将数据生成到此Surface中,但是一旦第一个源与Surface断开连接,同一个Surface可以与不同的API一起重用。

Returns
Surface A Surface to use for a drawing target for various APIs.

getWidth

Added in API level 19
int getWidth ()

默认宽度为 Images ,以像素为单位。

生产者发送缓冲区到这个ImageReader的表面可以覆盖宽度。 如果是这样,图像的实际宽度可以使用getWidth()找到。

Returns
int the expected width of an Image

newInstance

Added in API level 19
ImageReader newInstance (int width, 
                int height, 
                int format, 
                int maxImages)

为所需大小和格式的图像创建一个新阅读器。

maxImages参数确定可同时从ImageReader获取的最大数量为Image对象。 请求更多的缓冲区会占用更多的内存,因此仅使用用例所需的最小数量非常重要。

有效的大小和格式取决于图像数据的来源。

如果formatPRIVATE ,则创建的ImageReader将生成应用程序无法直接访问的图像。 应用程序仍然可以从此ImageReader获取图像,并将它们发送到camera以便通过ImageWriter接口进行再处理。 但是, getPlanes()将为PRIVATE格式图像返回一个空数组。 应用程序可以通过调用getImageFormat()来检查现有阅读器的格式。

与使用其他格式(如 YUV_420_888 ImageReader相比, PRIVATE格式 ImageReaders在应用程序无需访问图像数据时更有效。

Parameters
width int: The default width in pixels of the Images that this reader will produce.
height int: The default height in pixels of the Images that this reader will produce.
format int: The format of the Image that this reader will produce. This must be one of the ImageFormat or PixelFormat constants. Note that not all formats are supported, like ImageFormat.NV21.
maxImages int: The maximum number of images the user will want to access simultaneously. This should be as small as possible to limit memory use. Once maxImages Images are obtained by the user, one of them has to be released before a new Image will become available for access through acquireLatestImage() or acquireNextImage(). Must be greater than 0.
Returns
ImageReader

也可以看看:

setOnImageAvailableListener

Added in API level 19
void setOnImageAvailableListener (ImageReader.OnImageAvailableListener listener, 
                Handler handler)

当ImageReader中有新图像可用时,注册一个侦听器以供调用。

Parameters
listener ImageReader.OnImageAvailableListener: The listener that will be run.
handler Handler: The handler on which the listener should be invoked, or null if the listener should be invoked on the calling thread's looper.
Throws
IllegalArgumentException If no handler specified and the calling thread has no looper.

Protected methods

finalize

Added in API level 19
void finalize ()

当垃圾收集确定没有更多对该对象的引用时,由对象上的垃圾回收器调用。 子类会覆盖finalize方法以处置系统资源或执行其他清理。

的常规协定finalize是,它被调用,如果当在Java TM虚拟机已确定不再有由该目的可以通过还没有死亡,除了作为一个动作的结果的任何线程访问的任何手段取决于某些其他可以完成的对象或类别的最终定稿。 方法finalize可以采取任何行动,包括使这个对象再次可用于其他线程; 然而, finalize的通常目的是在对象被不可撤销地丢弃之前执行清理操作。 例如,表示输入/输出连接的对象的finalize方法可能会执行显式I / O事务,以在永久丢弃该对象之前中断连接。

Objectfinalize方法Object执行特殊操作; 它只是正常返回。 Object子类可能会覆盖此定义。

Java编程语言不保证哪个线程将为任何给定对象调用finalize方法。 但是,保证调用finalize的线程在调用finalize时不会保留任何用户可见的同步锁。 如果finalize方法引发未捕获的异常,则忽略该异常,并终止该对象的终止。

在针对某个对象调用 finalize方法后,将不会采取进一步的操作,直到Java虚拟机再次确定不再有任何途径可以通过尚未死亡的任何线程访问此对象,包括可能的操作通过准备完成的其他对象或类别,此时该对象可能被丢弃。

对于任何给定对象,Java虚拟机永远不会多次调用 finalize方法。

finalize方法引发的任何异常 finalize导致此对象的终止被暂停,但会被忽略。

Throws
Throwable

Hooray!