public class ImageReader
extends Object
implements AutoCloseable
java.lang.Object | |
↳ | android.media.ImageReader |
ImageReader类允许直接应用程序访问渲染到 Surface
图像数据
几款Android媒体API类接受面对象为目标,以渲染,包括MediaPlayer
, MediaCodec
, CameraDevice
, ImageWriter
和RenderScript Allocations
。 可以用于每个源的图像大小和格式各不相同,应在特定API的文档中进行检查。
图像数据封装在Image
对象中,并且可以同时访问多个此类对象,最多可达到maxImages
构造函数参数指定的数量。 通过Surface
发送到ImageReader的新图像排队,直到通过acquireLatestImage()
或acquireNextImage()
呼叫访问。 由于内存限制,如果ImageReader没有以等于生产速率的速率获取和释放图像,则图像源将最终在尝试渲染到Surface时停止或放下图像。
Nested classes |
|
---|---|
interface |
ImageReader.OnImageAvailableListener 回叫界面用于通知新图像可用。 |
Public methods |
|
---|---|
Image |
acquireLatestImage() |
Image |
acquireNextImage() 从ImageReader的队列中获取下一个Image。 |
void |
close() 释放与此ImageReader相关的所有资源。 |
int |
getHeight() 默认高度为 |
int |
getImageFormat()
|
int |
getMaxImages() 任何时候可从ImageReader获取的图像的最大数量(例如, |
Surface |
getSurface() |
int |
getWidth() 默认宽度为 |
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
|
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 |
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 |
也可以看看:
void close ()
释放与此ImageReader相关的所有资源。
调用此方法后,此ImageReader无法使用。 调用此ImageReader的和先前提供的图像的任何方法acquireNextImage()
或者acquireLatestImage()
将导致IllegalStateException
,并尝试从读取ByteBuffers
由先前的返回Plane#getBuffer
电话将有不确定的行为。
int getHeight ()
默认高度为 Images
(以像素为单位)。
生产者将缓冲区发送到此ImageReader的Surface可以覆盖高度。 如果是这样,图像的实际高度可以使用getHeight()
找到。
Returns | |
---|---|
int |
the expected height of an Image |
int getImageFormat ()
image format
的默认 Images
。
如果默认颜色格式允许,某些颜色格式可能会被生产者将缓冲区发送到此ImageReader的表面。 的ImageReader保证所有Images
从ImageReader的收购(例如,与acquireNextImage()
),将有一个“兼容”格式,以什么规定newInstance(int, int, int, int)
。 截至目前,每种格式只与自身兼容。 图像的实际格式可以使用getFormat()
找到。
Returns | |
---|---|
int |
the expected format of an Image |
也可以看看:
int getMaxImages ()
任何时候可以从ImageReader获取的图像的最大数量(例如, acquireNextImage()
)。
图像被ImageReader中的函数返回后被认为是获取的,直到图像 closed
才将图像释放回ImageReader。
试图并发获取超过maxImages
将导致IllegalStateException
函数抛出IllegalStateException
。 此外,尽管ImageReader用户已经获取了最大图像数量,但生成器排入其他图像的操作可能会停止,直到至少有一个图像被释放。
Returns | |
---|---|
int |
Maximum number of images for this ImageReader. |
也可以看看:
Surface getSurface ()
获得 Surface
,可用于生产 Images
这个 ImageReader
。
在将有效的图像数据渲染到此Surface
, acquireNextImage()
方法将返回null
。 只有一个源可以同时将数据生成到此Surface中,但是一旦第一个源与Surface
断开连接,同一个Surface
可以与不同的API一起重用。
Returns | |
---|---|
Surface |
A Surface to use for a drawing target for various APIs. |
int getWidth ()
默认宽度为 Images
,以像素为单位。
生产者发送缓冲区到这个ImageReader的表面可以覆盖宽度。 如果是这样,图像的实际宽度可以使用getWidth()
找到。
Returns | |
---|---|
int |
the expected width of an Image |
ImageReader newInstance (int width, int height, int format, int maxImages)
为所需大小和格式的图像创建一个新阅读器。
maxImages
参数确定可同时从ImageReader
获取的最大数量为Image
对象。 请求更多的缓冲区会占用更多的内存,因此仅使用用例所需的最小数量非常重要。
有效的大小和格式取决于图像数据的来源。
如果format
是PRIVATE
,则创建的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 |
也可以看看:
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. |
void finalize ()
当垃圾收集确定没有更多对该对象的引用时,由对象上的垃圾回收器调用。 子类会覆盖finalize
方法以处置系统资源或执行其他清理。
的常规协定finalize
是,它被调用,如果当在Java TM虚拟机已确定不再有由该目的可以通过还没有死亡,除了作为一个动作的结果的任何线程访问的任何手段取决于某些其他可以完成的对象或类别的最终定稿。 方法finalize
可以采取任何行动,包括使这个对象再次可用于其他线程; 然而, finalize
的通常目的是在对象被不可撤销地丢弃之前执行清理操作。 例如,表示输入/输出连接的对象的finalize方法可能会执行显式I / O事务,以在永久丢弃该对象之前中断连接。
类Object
的finalize
方法Object
执行特殊操作; 它只是正常返回。 Object
子类可能会覆盖此定义。
Java编程语言不保证哪个线程将为任何给定对象调用finalize
方法。 但是,保证调用finalize的线程在调用finalize时不会保留任何用户可见的同步锁。 如果finalize方法引发未捕获的异常,则忽略该异常,并终止该对象的终止。
在针对某个对象调用 finalize
方法后,将不会采取进一步的操作,直到Java虚拟机再次确定不再有任何途径可以通过尚未死亡的任何线程访问此对象,包括可能的操作通过准备完成的其他对象或类别,此时该对象可能被丢弃。
对于任何给定对象,Java虚拟机永远不会多次调用 finalize
方法。
finalize
方法引发的任何异常 finalize
导致此对象的终止被暂停,但会被忽略。
Throws | |
---|---|
Throwable |