Android 图像解码器
用于将编码图像转换为 RGBA 像素的函数。
摘要
与 Java 对应类 android.graphics.ImageDecoder 类似,它可用于解码以下格式的图像
- JPEG
- PNG
- GIF
- WebP
- BMP
- ICO
- WBMP
- HEIF
- 数码底片(通过 DNG SDK)
它具有类似的缩放、裁剪和选择输出格式的选项。与可以创建 android.graphics.Bitmap 或 android.graphics.drawable.Drawable 对象的 Java API 不同,AImageDecoder 直接解码到客户端提供的内存中。有关更多信息,请参阅图像解码器开发者指南。
枚举 |
|
---|---|
匿名枚举 28{
|
枚举 AImageDecoder 函数结果代码。 |
匿名枚举 29{
|
枚举 |
匿名枚举 30{
|
枚举 在显示下一帧之前,如何“处置”当前帧。 |
匿名枚举 31{
|
枚举 当前帧与上一帧的混合方式。 |
类型定义 |
|
---|---|
AImageDecoder
|
typedefstruct AImageDecoder
用于解码图像的不透明句柄。 |
AImageDecoderFrameInfo
|
typedefstruct AImageDecoderFrameInfo
包含关于单个帧的动画信息的不透明句柄。 |
AImageDecoderHeaderInfo
|
typedefstruct AImageDecoderHeaderInfo
表示关于编码图像信息的不透明句柄。 |
函数 |
|
---|---|
AImageDecoderFrameInfo_create()
|
AImageDecoderFrameInfo *_Nullable
创建一个未初始化的 AImageDecoderFrameInfo。
|
AImageDecoderFrameInfo_delete(AImageDecoderFrameInfo *_Nullable info)
|
void
删除 AImageDecoderFrameInfo。
|
AImageDecoderFrameInfo_getBlendOp(const AImageDecoderFrameInfo *_Nonnull info)
|
int32_t
返回此帧与上一帧的混合方式。
|
AImageDecoderFrameInfo_getDisposeOp(const AImageDecoderFrameInfo *_Nonnull info)
|
int32_t
返回此帧在显示下一帧之前如何“处置”。
|
AImageDecoderFrameInfo_getDuration(const AImageDecoderFrameInfo *_Nonnull info)
|
int64_t
报告显示当前帧的纳秒数。
|
AImageDecoderFrameInfo_getFrameRect(const AImageDecoderFrameInfo *_Nonnull info)
|
此帧更新的图像矩形(范围为 0, 0, AImageDecoderHeaderInfo_getWidth, AImageDecoderHeaderInfo_getHeight)。
|
AImageDecoderFrameInfo_hasAlphaWithinBounds(const AImageDecoderFrameInfo *_Nonnull info)
|
bool
此帧的新部分是否可能包含 Alpha。
|
AImageDecoderHeaderInfo_getAlphaFlags(const AImageDecoderHeaderInfo *_Nonnull)
|
int
报告 AImageDecoder 默认如何处理 Alpha 通道。
|
AImageDecoderHeaderInfo_getAndroidBitmapFormat(const AImageDecoderHeaderInfo *_Nonnull)
|
int32_t
报告 AImageDecoder 默认将解码为的 AndroidBitmapFormat。
|
AImageDecoderHeaderInfo_getDataSpace(const AImageDecoderHeaderInfo *_Nonnull)
|
int32_t
报告 AImageDecoder 默认将解码为的数据空间。
|
AImageDecoderHeaderInfo_getHeight(const AImageDecoderHeaderInfo *_Nonnull)
|
int32_t
报告编码图像的原始高度。
|
AImageDecoderHeaderInfo_getMimeType(const AImageDecoderHeaderInfo *_Nonnull)
|
const char *_Nonnull
报告编码图像的 mimeType。
|
AImageDecoderHeaderInfo_getWidth(const AImageDecoderHeaderInfo *_Nonnull)
|
int32_t
报告编码图像的原始宽度。
|
AImageDecoder_advanceFrame(AImageDecoder *_Nonnull decoder)
|
int
前进到动画中的下一帧。
|
AImageDecoder_computeSampledSize(const AImageDecoder *_Nonnull decoder, int sampleSize, int32_t *_Nonnull width, int32_t *_Nonnull height)
|
int
计算给定 sampleSize 的尺寸。
|
AImageDecoder_createFromAAsset(struct AAsset *_Nonnull asset, AImageDecoder *_Nullable *_Nonnull outDecoder)
|
int
从 AAsset 创建一个新的 AImageDecoder。
|
AImageDecoder_createFromBuffer(const void *_Nonnull buffer, size_t length, AImageDecoder *_Nullable *_Nonnull outDecoder)
|
int
从缓冲区创建新的 AImageDecoder。
|
AImageDecoder_createFromFd(int fd, AImageDecoder *_Nullable *_Nonnull outDecoder)
|
int
从文件描述符创建新的 AImageDecoder。
|
AImageDecoder_decodeImage(AImageDecoder *_Nonnull decoder, void *_Nonnull pixels, size_t stride, size_t size)
|
int
使用 AImageDecoder 的设置将图像解码为像素。
|
AImageDecoder_delete(AImageDecoder *_Nullable decoder)
|
void
删除 AImageDecoder。
|
AImageDecoder_getFrameInfo(AImageDecoder *_Nonnull decoder, AImageDecoderFrameInfo *_Nonnull info)
|
int
用有关当前帧的信息填充 |info|。
|
AImageDecoder_getHeaderInfo(const AImageDecoderHeaderInfo *_Nonnull decoder)
|
const AImageDecoderHeaderInfo *_Nonnull
返回用于读取头部信息的不透明句柄。
|
AImageDecoder_getMinimumStride(AImageDecoder *_Nonnull decoder)
|
size_t
返回可以在 AImageDecoder_decodeImage 中使用的最小步幅。
|
AImageDecoder_getRepeatCount(AImageDecoder *_Nonnull decoder)
|
int32_t
报告动画应重复多少次。
|
AImageDecoder_isAnimated(AImageDecoder *_Nonnull decoder)
|
bool
如果图像是动画(即有多帧),则返回 true。
|
AImageDecoder_resultToString(int)
|
const char *_Nullable
返回表示错误代码的常量字符串值。
|
AImageDecoder_rewind(AImageDecoder *_Nonnull decoder)
|
int
返回到动画的开头。
|
AImageDecoder_setAndroidBitmapFormat(AImageDecoder *_Nonnull decoder, int32_t format)
|
int
选择所需的输出格式。
|
AImageDecoder_setCrop(AImageDecoder *_Nonnull decoder, ARect crop)
|
int
指定缩放后(如果有)如何裁剪输出。
|
AImageDecoder_setDataSpace(AImageDecoder *_Nonnull decoder, int32_t dataspace)
|
int
选择输出的数据空间。
|
AImageDecoder_setInternallyHandleDisposePrevious(AImageDecoder *_Nonnull decoder, bool handleInternally)
|
void
是否让 AImageDecoder 在解码标记为 ANDROID_IMAGE_DECODER_DISPOSE_OP_PREVIOUS 的帧之前存储该帧。
|
AImageDecoder_setTargetSize(AImageDecoder *_Nonnull decoder, int32_t width, int32_t height)
|
int
指定解码图像的输出大小。
|
AImageDecoder_setUnpremultipliedRequired(AImageDecoder *_Nonnull decoder, bool unpremultipliedRequired)
|
int
指定输出的像素是否应为未预乘。
|
枚举
匿名枚举 28
声明于android/imagedecoder.h
中
Anonymous Enum 28
AImageDecoder 函数结果代码。
在 API 30 中引入。
许多函数会返回此值来指示成功 (ANDROID_IMAGE_DECODER_SUCCESS) 或失败原因。失败时,任何输出参数都应被视为未初始化,除非另有说明。使用 AImageDecoder_resultToString 获取结果代码的可读版本。
属性 | |
---|---|
ANDROID_IMAGE_DECODER_BAD_PARAMETER |
某个其他参数无效。 |
ANDROID_IMAGE_DECODER_ERROR |
输入在解码某些行后包含错误。 |
ANDROID_IMAGE_DECODER_FINISHED |
动画已到达末尾。 |
ANDROID_IMAGE_DECODER_INCOMPLETE |
输入不完整。 |
ANDROID_IMAGE_DECODER_INTERNAL_ERROR |
某些其他错误。 例如,内部分配失败。 |
ANDROID_IMAGE_DECODER_INVALID_CONVERSION |
无法转换。 例如,尝试将具有 alpha 的图像解码为不透明格式。 |
ANDROID_IMAGE_DECODER_INVALID_INPUT |
输入在解码任何像素之前无效。 |
ANDROID_IMAGE_DECODER_INVALID_SCALE |
缩放无效。 可能溢出,或与当前 alpha 设置不兼容。 |
ANDROID_IMAGE_DECODER_INVALID_STATE |
AImageDecoder 处于当前状态时,无法调用此方法。 例如,各种设置器(如 AImageDecoder_setTargetSize)只能在 AImageDecoder 设置为解码动画的第一帧时调用。这可确保混合和/或恢复先前帧正常工作。 |
ANDROID_IMAGE_DECODER_SEEK_ERROR |
需要查找,但失败了。 |
ANDROID_IMAGE_DECODER_SUCCESS |
解码成功且完整。 |
ANDROID_IMAGE_DECODER_UNSUPPORTED_FORMAT |
AImageDecoder 未识别该格式。 |
匿名枚举 29
声明于android/imagedecoder.h
中
Anonymous Enum 29
属性 | |
---|---|
ANDROID_IMAGE_DECODER_INFINITE |
由 AImageDecoder_getRepeatCount 报告,表示动画应永远重复。 在 API 31 中引入 |
匿名枚举 30
声明于android/imagedecoder.h
中
Anonymous Enum 30
在显示下一帧之前,如何“处置”当前帧。
在 API 31 中引入。
这个信息,以及 AImageDecoderFrameInfo 中的其他信息,对于确定帧是否独立很有用,但解码器会处理帧的处置,因此简单的顺序客户端不需要这个。
属性 | |
---|---|
ANDROID_IMAGE_DECODER_DISPOSE_OP_BACKGROUND |
在解码下一帧之前,帧的矩形会被清除为透明(由 AImageDecoder 执行)。 |
ANDROID_IMAGE_DECODER_DISPOSE_OP_NONE |
不进行处置。 下一帧将直接绘制在此帧之上。 |
ANDROID_IMAGE_DECODER_DISPOSE_OP_PREVIOUS |
在解码下一帧之前,帧的矩形会恢复到先前的帧。 除非 AImageDecoder_setInternallyHandleDisposePrevious 设置为 false,否则这由 AImageDecoder 处理。 |
匿名枚举 31
声明于android/imagedecoder.h
中
Anonymous Enum 31
当前帧与上一帧的混合方式。
在 API 31 中引入。
这个信息,以及 AImageDecoderFrameInfo 中的其他信息,对于确定帧是否独立很有用,但解码器会处理帧的混合,因此简单的顺序客户端不需要这个。
属性 | |
---|---|
ANDROID_IMAGE_DECODER_BLEND_OP_SRC |
此帧替换现有内容。 这对应于 webp 的“不混合”。 |
ANDROID_IMAGE_DECODER_BLEND_OP_SRC_OVER |
此帧与先前帧混合。 |
类型定义
AImageDecoder
声明于android/imagedecoder.h
中
struct AImageDecoder AImageDecoder
用于解码图像的不透明句柄。
在 API 30 中引入
使用以下方法之一创建
创建后,可以使用 AImageDecoder_getHeaderInfo 检索编码图像的信息。其他函数,如 AImageDecoder_setTargetSize,可用于指定如何解码,而 AImageDecoder_decodeImage 会解码到客户端提供的内存中。
AImageDecoder 对象不是线程安全的,不应跨线程共享。
AImageDecoderFrameInfo
声明于android/imagedecoder.h
中
struct AImageDecoderFrameInfo AImageDecoderFrameInfo
包含关于单个帧的动画信息的不透明句柄。
在 API 31 中引入
持续时间(使用 AImageDecoderFrameInfo_getDuration 检索)对于客户端以正确的速度显示动画是必要的。对于想要确定哪些帧是独立的(或它们依赖于哪些帧)的客户端来说,其他信息很有帮助,但对于想要按顺序显示所有帧的简单客户端来说则不必要。
AImageDecoderHeaderInfo
声明于android/imagedecoder.h
中
struct AImageDecoderHeaderInfo AImageDecoderHeaderInfo
表示关于编码图像信息的不透明句柄。
在 API 30 中引入
使用 AImageDecoder_getHeaderInfo 检索,并传递给 AImageDecoderHeaderInfo_getWidth 和 AImageDecoderHeaderInfo_getHeight 等方法。
函数
AImageDecoderFrameInfo_create
声明于android/imagedecoder.h
中
AImageDecoderFrameInfo *_Nullable AImageDecoderFrameInfo_create()
创建一个未初始化的 AImageDecoderFrameInfo。
在 API 31 中引入。
这可以传递给 AImageDecoder_getFrameInfo,以填充有关当前帧的信息。它可以重复使用。
必须使用 AImageDecoderFrameInfo_delete 删除。
AImageDecoderFrameInfo_delete
声明于android/imagedecoder.h
中
void AImageDecoderFrameInfo_delete( AImageDecoderFrameInfo *_Nullable info )
删除 AImageDecoderFrameInfo。
在 API 31 中引入。
AImageDecoderFrameInfo_getBlendOp
声明于android/imagedecoder.h
中
int32_t AImageDecoderFrameInfo_getBlendOp( const AImageDecoderFrameInfo *_Nonnull info )
返回此帧与上一帧的混合方式。
在 API 31 中引入。
这个信息,以及 AImageDecoderFrameInfo 中的其他信息,对于确定帧是否独立很有用,但解码器会处理帧的混合,因此简单的顺序客户端不需要这个。
详细信息 | |
---|---|
返回 |
其中之一
|
AImageDecoderFrameInfo_getDisposeOp
声明于android/imagedecoder.h
中
int32_t AImageDecoderFrameInfo_getDisposeOp( const AImageDecoderFrameInfo *_Nonnull info )
返回此帧在显示下一帧之前如何“处置”。
在 API 31 中引入。
这个信息,以及 AImageDecoderFrameInfo 中的其他信息,对于确定帧是否独立很有用,但解码器会处理帧的处置,因此简单的顺序客户端不需要这个。
详细信息 | |
---|---|
返回 |
AImageDecoderFrameInfo_getDuration
声明于android/imagedecoder.h
中
int64_t AImageDecoderFrameInfo_getDuration( const AImageDecoderFrameInfo *_Nonnull info )
AImageDecoderFrameInfo_getFrameRect
声明于android/imagedecoder.h
中
ARect AImageDecoderFrameInfo_getFrameRect( const AImageDecoderFrameInfo *_Nonnull info )
此帧更新的图像矩形(范围为 0, 0, AImageDecoderHeaderInfo_getWidth, AImageDecoderHeaderInfo_getHeight)。
在 API 31 中引入。
请注意,这不受 AImageDecoder_setTargetSize 或 AImageDecoder_setCrop 调用的影响。
帧可能仅更新图像的一部分。这将始终包含在图像的维度内。
这个信息,以及 AImageDecoderFrameInfo 中的其他信息,对于确定帧是否独立很有用,但解码器会处理帧的混合,因此简单的顺序客户端不需要这个。
错误
- 如果 |info| 为 null,则返回空的 ARect。
AImageDecoderFrameInfo_hasAlphaWithinBounds
声明于android/imagedecoder.h
中
bool AImageDecoderFrameInfo_hasAlphaWithinBounds( const AImageDecoderFrameInfo *_Nonnull info )
此帧的新部分是否可能包含 Alpha。
在 API 31 中引入。
除非此帧是独立的(请参阅 AImageDecoder_decodeImage),否则调用一次 AImageDecoder_decodeImage 将解码更新的像素矩形,然后根据 AImageDecoderFrameInfo_getBlendOp 将其与 |pixels| 缓冲区中现有像素进行混合。此方法返回在混合之前,更新的矩形是否具有 alpha。返回值是保守的;例如,如果基于颜色索引的帧具有带有 alpha 的颜色但未使用它,此方法仍将返回 true。
这个信息,以及 AImageDecoderFrameInfo 中的其他信息,对于确定帧是否独立很有用,但解码器会处理帧的混合,因此简单的顺序客户端不需要这个。
请注意,这可能与合成帧(即混合后的结果图像)是否具有 alpha 不同。例如,如果此帧未填充整个图像尺寸(请参阅 AImageDecoderFrameInfo_getFrameRect)或它与不透明帧混合,则合成帧的 alpha 可能不匹配。
错误
- 如果 |info| 为 null,则返回 false。
AImageDecoderHeaderInfo_getAlphaFlags
声明于android/imagedecoder.h
中
int AImageDecoderHeaderInfo_getAlphaFlags( const AImageDecoderHeaderInfo *_Nonnull )
报告 AImageDecoder 默认如何处理 Alpha 通道。
如果图像不包含 alpha(根据其头部信息),此方法将返回 ANDROID_BITMAP_FLAGS_ALPHA_OPAQUE。如果图像可能包含 alpha,则返回 ANDROID_BITMAP_FLAGS_ALPHA_PREMUL,因为 AImageDecoder_decodeImage 默认会预乘像素。
从 API level 30 开始可用。
从 API level 31 开始,AImageDecoder 可能包含动画的多帧,但此方法仍仅报告第一帧是否具有 alpha。
AImageDecoderHeaderInfo_getAndroidBitmapFormat
声明于android/imagedecoder.h
中
int32_t AImageDecoderHeaderInfo_getAndroidBitmapFormat( const AImageDecoderHeaderInfo *_Nonnull )
报告 AImageDecoder 默认将解码为的 AndroidBitmapFormat。
AImageDecoder 会尝试选择一种对图像和系统合理的格式。请注意,这并不表示图像的编码格式。
从 API level 30 开始可用。
AImageDecoderHeaderInfo_getDataSpace
声明于android/imagedecoder.h
中
int32_t AImageDecoderHeaderInfo_getDataSpace( const AImageDecoderHeaderInfo *_Nonnull )
报告 AImageDecoder 默认将解码为的数据空间。
默认情况下,AImageDecoder_decodeImage 不会执行任何颜色转换。
从 API level 30 开始可用。
请注意,ADataSpace 仅暴露了一些值。即使对于已命名的 ColorSpaces,如果它们没有对应的 ADataSpace,此方法也可能返回 ADATASPACE_UNKNOWN。
详细信息 | |
---|---|
返回 |
表示颜色编码方式的 ADataSpace (如果不存在对应的 ADataSpace,则返回 ADATASPACE_UNKNOWN)。这指定了如何解释解码图像中的颜色,除非调用 AImageDecoder_setDataSpace 以解码到不同的 ADataSpace。
|
AImageDecoderHeaderInfo_getHeight
声明于android/imagedecoder.h
中
int32_t AImageDecoderHeaderInfo_getHeight( const AImageDecoderHeaderInfo *_Nonnull )
报告编码图像的原始高度。
除非使用 AImageDecoder_setTargetSize 选择不同的尺寸或使用 AImageDecoder_setCrop 设置裁剪矩形,否则这也是输出的逻辑像素高度。
从 API level 30 开始可用。
AImageDecoderHeaderInfo_getMimeType
声明于android/imagedecoder.h
中
const char *_Nonnull AImageDecoderHeaderInfo_getMimeType( const AImageDecoderHeaderInfo *_Nonnull )
报告编码图像的 mimeType。
从 API level 30 开始可用。
详细信息 | |
---|---|
返回 |
描述 mime 类型的字符串字面量。
|
AImageDecoderHeaderInfo_getWidth
声明于android/imagedecoder.h
中
int32_t AImageDecoderHeaderInfo_getWidth( const AImageDecoderHeaderInfo *_Nonnull )
报告编码图像的原始宽度。
除非使用 AImageDecoder_setTargetSize 选择不同的尺寸或使用 AImageDecoder_setCrop 设置裁剪矩形,否则这也是输出的逻辑像素宽度。
从 API level 30 开始可用。
AImageDecoder_advanceFrame
声明于android/imagedecoder.h
中
int AImageDecoder_advanceFrame( AImageDecoder *_Nonnull decoder )
前进到动画中的下一帧。
在 API 31 中引入。
AImageDecoder 在内部跟踪它准备解码的帧(“当前帧”)。最初,它被设置为解码第一帧,并且每次调用 AImageDecoder_decodeImage 都将继续解码同一帧,直到调用此方法(或 AImageDecoder_rewind)。
请注意,这可用于跳过一帧而不解码它。但有些帧依赖于(即与)先前的帧混合,而 AImageDecoder_decodeImage 假定先前的帧位于 |pixels| 缓冲区中。此外,AImageDecoder_decodeImage 处理帧的缓存和恢复(请参阅 ANDROID_IMAGE_DECODER_DISPOSE_OP_PREVIOUS),因此跳过包含此类帧的图像中的帧可能无法产生正确的结果。
仅支持 ANDROID_BITMAP_FORMAT_RGBA_8888 和 ANDROID_BITMAP_FORMAT_RGBA_F16。
错误
- ANDROID_IMAGE_DECODER_BAD_PARAMETER:AImageDecoder 表示非动画图像(请参阅 AImageDecoder_isAnimated)或 AImageDecoder 为 null。
- 请求的 AndroidBitmapFormat 不支持动画。
- ANDROID_IMAGE_DECODER_INCOMPLETE:输入似乎已被截断。客户端必须先调用 AImageDecoder_rewind,然后才能再次调用 AImageDecoder_decodeImage。
- ANDROID_IMAGE_DECODER_ERROR:输入包含错误。客户端必须先调用 AImageDecoder_rewind,然后才能再次调用 AImageDecoder_decodeImage。
- ANDROID_IMAGE_DECODER_FINISHED:输入中没有更多帧。客户端必须先调用 AImageDecoder_rewind,然后才能再次调用 AImageDecoder_decodeImage。
详细信息 | |||
---|---|---|---|
参数 |
|
||
返回 |
成功时返回 ANDROID_IMAGE_DECODER_SUCCESS 或指示失败原因的值。
|
AImageDecoder_computeSampledSize
声明于android/imagedecoder.h
中
int AImageDecoder_computeSampledSize( const AImageDecoder *_Nonnull decoder, int sampleSize, int32_t *_Nonnull width, int32_t *_Nonnull height )
计算给定 sampleSize 的尺寸。
尽管 AImageDecoder 可以缩放到任意目标尺寸(请参阅 AImageDecoder_setTargetSize),但某些尺寸可能比其他尺寸更高效。此方法计算用于达到特定 sampleSize 的最有效目标尺寸。
从 API level 30 开始可用。
错误
- ANDROID_IMAGE_DECODER_BAD_PARAMETER:AImageDecoder、|width| 或 |height| 为 null,或 |sampleSize| < 1。
详细信息 | |||||||||
---|---|---|---|---|---|---|---|---|---|
参数 |
|
||||||||
返回 |
成功时返回 ANDROID_IMAGE_DECODER_SUCCESS 或指示失败原因的值。
|
AImageDecoder_createFromAAsset
声明于android/imagedecoder.h
中
int AImageDecoder_createFromAAsset( struct AAsset *_Nonnull asset, AImageDecoder *_Nullable *_Nonnull outDecoder )
从 AAsset 创建一个新的 AImageDecoder。
从 API level 30 开始可用。
错误
- ANDROID_IMAGE_DECODER_INCOMPLETE:在读取图像头部信息之前,资产被截断。
- ANDROID_IMAGE_DECODER_BAD_PARAMETER:其中一个参数为 null。
- ANDROID_IMAGE_DECODER_INVALID_INPUT:头部信息中存在错误。
- ANDROID_IMAGE_DECODER_SEEK_ERROR:资产查找失败。
- ANDROID_IMAGE_DECODER_INTERNAL_ERROR:某些其他错误,例如内存分配失败。
- ANDROID_IMAGE_DECODER_UNSUPPORTED_FORMAT:不支持该格式。
详细信息 | |||||
---|---|---|---|---|---|
参数 |
|
||||
返回 |
成功时返回 ANDROID_IMAGE_DECODER_SUCCESS 或指示失败原因的值。
|
AImageDecoder_createFromBuffer
声明于android/imagedecoder.h
中
int AImageDecoder_createFromBuffer( const void *_Nonnull buffer, size_t length, AImageDecoder *_Nullable *_Nonnull outDecoder )
从缓冲区创建新的 AImageDecoder。
从 API level 30 开始可用。
错误
- ANDROID_IMAGE_DECODER_INCOMPLETE:在读取图像头部信息之前,编码图像被截断。
- ANDROID_IMAGE_DECODER_BAD_PARAMETER:其中一个参数无效。
- ANDROID_IMAGE_DECODER_INVALID_INPUT:头部信息中存在错误。
- ANDROID_IMAGE_DECODER_INTERNAL_ERROR:某些其他错误,例如内存分配失败。
- ANDROID_IMAGE_DECODER_UNSUPPORTED_FORMAT:不支持该格式。
详细信息 | |||||||
---|---|---|---|---|---|---|---|
参数 |
|
||||||
返回 |
成功时返回 ANDROID_IMAGE_DECODER_SUCCESS 或指示失败原因的值。
|
AImageDecoder_createFromFd
声明于android/imagedecoder.h
中
int AImageDecoder_createFromFd( int fd, AImageDecoder *_Nullable *_Nonnull outDecoder )
从文件描述符创建新的 AImageDecoder。
从 API level 30 开始可用。
错误
- ANDROID_IMAGE_DECODER_INCOMPLETE:在读取图像头部信息之前,文件被截断。
- ANDROID_IMAGE_DECODER_BAD_PARAMETER:AImageDecoder 为 null,或 |fd| 不表示有效、可查找的文件描述符。
- ANDROID_IMAGE_DECODER_INVALID_INPUT:头部信息中存在错误。
- ANDROID_IMAGE_DECODER_SEEK_ERROR:描述符查找失败。
- ANDROID_IMAGE_DECODER_INTERNAL_ERROR:某些其他错误,例如内存分配失败。
- ANDROID_IMAGE_DECODER_UNSUPPORTED_FORMAT:不支持该格式。
详细信息 | |||||
---|---|---|---|---|---|
参数 |
|
||||
返回 |
成功时返回 ANDROID_IMAGE_DECODER_SUCCESS 或指示失败原因的值。
|
AImageDecoder_decodeImage
声明于android/imagedecoder.h
中
int AImageDecoder_decodeImage( AImageDecoder *_Nonnull decoder, void *_Nonnull pixels, size_t stride, size_t size )
使用 AImageDecoder 的设置将图像解码为像素。
从 API level 30 开始可用。
从 API level 31 开始,可以使用新的 API 解码动画图像(即 GIF、WebP)的所有帧。在内部,AImageDecoder 会跟踪其“当前帧”——即调用 AImageDecoder_decodeImage 将要解码的帧。创建时,当前帧始终是第一帧,多次调用此方法将每次都解码第一帧。AImageDecoder_advanceFrame 将当前帧前进到下一帧,以便将来调用此方法时将解码该帧。有些帧可能仅更新图像的一部分。它们可能仅更新子矩形(请参阅 AImageDecoderFrameInfo_getFrameRect),或者它们可能具有 alpha(请参阅 AImageDecoderFrameInfo_hasAlphaWithinBounds)。在这些情况下,此方法假定先前的帧仍驻留在 |pixels| 缓冲区中,仅解码新部分,并将其与缓冲区混合。改变整个 |pixels| 缓冲区的帧是“独立的”,不需要先前的帧保留在缓冲区中。第一帧始终是独立的。一个复杂的客户端可以使用 AImageDecoderFrameInfo 中的信息来确定其他帧是否独立,或者它们依赖于哪些帧。
如果当前帧标记为 ANDROID_IMAGE_DECODER_DISPOSE_OP_PREVIOUS,AImageDecoder_decodeImage 将在解码之前存储 |pixels| 缓冲区(注意:这仅发生在连续的 ANDROID_IMAGE_DECODER_DISPOSE_OP_PREVIOUS 帧序列中的第一帧)。前进到下一帧后,AImageDecoder_decodeImage 将在解码该帧之前恢复该缓冲区。这是默认行为,但可以通过将 false 传递给 AImageDecoder_setInternallyHandleDisposePrevious 来禁用它。
忽略计时信息、显示等,希望解码动画图像所有帧的客户端可以概念性地使用如下代码:
while (true) { int result = AImageDecoder_decodeImage(decoder, pixels, stride, size); if (result != ANDROID_IMAGE_DECODER_SUCCESS) break;
// 显示或保存 |pixels| 中的图像,保持缓冲区完整以便 // AImageDecoder 正确解码下一帧。 Application_viewImage(pixels);
result = AImageDecoder_advanceFrame(decoder); if (result != ANDROID_IMAGE_DECODER_SUCCESS) break; }
错误
- ANDROID_IMAGE_DECODER_INCOMPLETE:图像被截断。已解码部分图像,未解码的行已初始化为全零。
- ANDROID_IMAGE_DECODER_ERROR:图像包含错误。已解码部分图像,未解码的行已初始化为全零。
- ANDROID_IMAGE_DECODER_BAD_PARAMETER:AImageDecoder 或 |pixels| 为 null,步幅不够大或未对齐像素,或者 |size| 不够大。
- ANDROID_IMAGE_DECODER_SEEK_ERROR:资产或文件描述符查找失败。
- ANDROID_IMAGE_DECODER_INTERNAL_ERROR:某些其他错误,例如内存分配失败。
- ANDROID_IMAGE_DECODER_FINISHED:输入中没有更多帧。未发生解码。客户端必须先调用 AImageDecoder_rewind,然后才能再次调用 AImageDecoder_decodeImage。
详细信息 | |||||||||
---|---|---|---|---|---|---|---|---|---|
参数 |
|
||||||||
返回 |
成功时返回 ANDROID_IMAGE_DECODER_SUCCESS 或指示失败原因的值。
|
AImageDecoder_delete
声明于android/imagedecoder.h
中
void AImageDecoder_delete( AImageDecoder *_Nullable decoder )
删除 AImageDecoder。
详细信息 | |||
---|---|---|---|
参数 |
|
AImageDecoder_getFrameInfo
声明于android/imagedecoder.h
中
int AImageDecoder_getFrameInfo( AImageDecoder *_Nonnull decoder, AImageDecoderFrameInfo *_Nonnull info )
用有关当前帧的信息填充 |info|。
在 API 31 中引入。
最初,此方法将返回有关第一帧的信息。AImageDecoder_advanceFrame 和 AImageDecoder_rewind 可用于更改当前帧。
如果图像只有一帧,此方法将使用编码信息和合理的默认值填充 AImageDecoderFrameInfo。
如果 AImageDecoder_advanceFrame 成功,此方法也将成功。
错误
- ANDROID_IMAGE_DECODER_BAD_PARAMETER:其中一个参数为 null。
- ANDROID_IMAGE_DECODER_FINISHED:输入中没有更多帧。客户端必须调用 AImageDecoder_rewind 来将当前帧重置为有效帧 (0)。
详细信息 | |||||
---|---|---|---|---|---|
参数 |
|
||||
返回 |
成功时返回 ANDROID_IMAGE_DECODER_SUCCESS 或指示失败原因的值。
|
AImageDecoder_getHeaderInfo
声明于android/imagedecoder.h
中
const AImageDecoderHeaderInfo *_Nonnull AImageDecoder_getHeaderInfo( const AImageDecoder *_Nonnull decoder )
返回用于读取头部信息的不透明句柄。
此对象归 AImageDecoder 所有,并通过 AImageDecoder_delete 销毁 AImageDecoder 时会销毁。
从 API level 30 开始可用。
详细信息 | |||
---|---|---|---|
参数 |
|
AImageDecoder_getMinimumStride
声明于android/imagedecoder.h
中
size_t AImageDecoder_getMinimumStride( AImageDecoder *_Nonnull decoder )
返回可以在 AImageDecoder_decodeImage 中使用的最小步幅。
此步幅不提供填充,这意味着它将完全等于宽度乘以所用 AndroidBitmapFormat 的每像素字节数。
如果输出被缩放(通过 AImageDecoder_setTargetSize)和/或裁剪(通过 AImageDecoder_setCrop),此方法会考虑这些因素。
从 API level 30 开始可用。
详细信息 | |||
---|---|---|---|
参数 |
|
AImageDecoder_getRepeatCount
声明于android/imagedecoder.h
中
int32_t AImageDecoder_getRepeatCount( AImageDecoder *_Nonnull decoder )
报告动画应重复多少次。
在 API 31 中引入。
这不包括首次播放。例如,重复计数为 4 意味着每帧播放 5 次。
ANDROID_IMAGE_DECODER_INFINITE 表示永远重复。
这可能需要查找。
对于非动画格式,此方法返回 0。如果编码图像包含重复计数,它可能对于只有一帧的图像返回非零值(即 AImageDecoder_isAnimated 返回 false)。
错误
- ANDROID_IMAGE_DECODER_BAD_PARAMETER:AImageDecoder 为 null。
详细信息 | |||
---|---|---|---|
参数 |
|
||
返回 |
成功时返回重复次数或指示失败原因的值。
|
AImageDecoder_isAnimated
声明于android/imagedecoder.h
中
bool AImageDecoder_isAnimated( AImageDecoder *_Nonnull decoder )
如果图像是动画(即有多帧),则返回 true。
有多帧。
在 API 31 中引入。
单帧 GIF 被认为不是动画。这可能需要查找第一帧之后是否存在下一帧来验证。
错误
- 如果 |decoder| 为 null,则返回 false。
详细信息 | |||
---|---|---|---|
参数 |
|
AImageDecoder_resultToString
声明于android/imagedecoder.h
中
const char *_Nullable AImageDecoder_resultToString( int )
返回表示错误代码的常量字符串值。
在 API 31 中引入。
传递 AImageDecoder 方法(例如 AImageDecoder_decodeImage)的返回值,以获取表示错误代码的文本字符串。
错误
- 对于超出范围的值返回 null。
AImageDecoder_rewind
声明于android/imagedecoder.h
中
int AImageDecoder_rewind( AImageDecoder *_Nonnull decoder )
返回到动画的开头。
在 API 31 中引入。
此调用后,AImageDecoder 将准备好解码动画的第一帧。可以在到达动画末尾、发生错误或动画中间时调用此方法。
错误
- ANDROID_IMAGE_DECODER_BAD_PARAMETER:AImageDecoder 表示非动画图像(请参阅 AImageDecoder_isAnimated)或 AImageDecoder 为 null。
- ANDROID_IMAGE_DECODER_SEEK_ERROR:资产或文件描述符查找失败。
详细信息 | |||
---|---|---|---|
参数 |
|
||
返回 |
成功时返回 ANDROID_IMAGE_DECODER_SUCCESS 或指示失败原因的值。
|
AImageDecoder_setAndroidBitmapFormat
声明于android/imagedecoder.h
中
int AImageDecoder_setAndroidBitmapFormat( AImageDecoder *_Nonnull decoder, int32_t format )
选择所需的输出格式。
如果编码图像表示动画,则必须在第一帧时调用此方法(例如,在调用 AImageDecoder_advanceFrame 之前或调用 AImageDecoder_rewind 之后)。
从 API level 30 开始可用。
错误
- ANDROID_IMAGE_DECODER_BAD_PARAMETER:AImageDecoder 为 null,或 |format| 不对应于 AndroidBitmapFormat。
- ANDROID_IMAGE_DECODER_INVALID_CONVERSION:AndroidBitmapFormat 与图像不兼容。
- ANDROID_IMAGE_DECODER_INVALID_STATE:动画不在第一帧。
详细信息 | |||||
---|---|---|---|---|---|
参数 |
|
||||
返回 |
成功时返回 ANDROID_IMAGE_DECODER_SUCCESS 或指示失败原因的值。失败时,AImageDecoder 使用它已计划使用的格式(其默认格式或之前成功设置的格式)。
|
AImageDecoder_setCrop
声明于android/imagedecoder.h
中
int AImageDecoder_setCrop( AImageDecoder *_Nonnull decoder, ARect crop )
指定缩放后(如果有)如何裁剪输出。
将来调用 AImageDecoder_decodeImage 将根据指定的 ARect 裁剪其输出。客户端只需为裁剪后的 ARect 分配足够的内存即可。
如果编码图像表示动画,则必须在第一帧时调用此方法(例如,在调用 AImageDecoder_advanceFrame 之前或调用 AImageDecoder_rewind 之后)。
从 API level 30 开始可用。
错误
- ANDROID_IMAGE_DECODER_BAD_PARAMETER:AImageDecoder 为 null,或裁剪未包含在(可能已缩放的)图像维度内。
- ANDROID_IMAGE_DECODER_INVALID_STATE:动画不在第一帧。
详细信息 | |||||
---|---|---|---|---|---|
参数 |
|
||||
返回 |
成功时返回 ANDROID_IMAGE_DECODER_SUCCESS 或指示失败原因的值。
|
AImageDecoder_setDataSpace
声明于android/imagedecoder.h
中
int AImageDecoder_setDataSpace( AImageDecoder *_Nonnull decoder, int32_t dataspace )
选择输出的数据空间。
ANDROID_BITMAP_FORMAT_A_8 会忽略此参数,因为它不支持 ADataSpace。
如果编码图像表示动画,则必须在第一帧时调用此方法(例如,在调用 AImageDecoder_advanceFrame 之前或调用 AImageDecoder_rewind 之后)。
从 API level 30 开始可用。
错误
- ANDROID_IMAGE_DECODER_BAD_PARAMETER:AImageDecoder 为 null,或 |dataspace| 不对应于 ADataSpace 值。
- ANDROID_IMAGE_DECODER_INVALID_STATE:动画不在第一帧。
详细信息 | |||||
---|---|---|---|---|---|
参数 |
|
||||
返回 |
成功时返回 ANDROID_IMAGE_DECODER_SUCCESS 或指示失败原因的值。
|
AImageDecoder_setInternallyHandleDisposePrevious
声明于android/imagedecoder.h
中
void AImageDecoder_setInternallyHandleDisposePrevious( AImageDecoder *_Nonnull decoder, bool handleInternally )
是否让 AImageDecoder 在解码标记为 ANDROID_IMAGE_DECODER_DISPOSE_OP_PREVIOUS 的帧之前存储该帧。
在 API 31 中引入。
默认为 true。许多图像不会有这样的帧(WebP 不支持它,只有部分 GIF 使用它)。但如果帧 i 是 ANDROID_IMAGE_DECODER_DISPOSE_OP_PREVIOUS,那么 i+1 可能依赖于 i-1。当此设置项为 true 时,AImageDecoder 将防御性地将帧 i-1(即 AImageDecoder_decodeImage 中 |pixels| 的内容)复制到内部缓冲区中,以便可以用于解码 i+1。
AImageDecoder 将仅存储一帧,其尺寸由 AImageDecoder_setTargetSize 指定(如果未调用该方法,则使用原始尺寸),并在不再需要时将其丢弃。
希望手动存储此类帧的客户端可以将此设置为 false,这样 AImageDecoder 就无需存储此额外帧。相反,在解码相同的 ANDROID_IMAGE_DECODER_DISPOSE_OP_PREVIOUS 帧 i 时,AImageDecoder 将直接解码到 |pixels| 中,假定客户端已存储了 i-1。当要求解码帧 i+1 时,AImageDecoder 现在将假定客户端在 |pixels| 中提供了 i-1。
详细信息 | |||||
---|---|---|---|---|---|
参数 |
|
AImageDecoder_setTargetSize
声明于android/imagedecoder.h
中
int AImageDecoder_setTargetSize( AImageDecoder *_Nonnull decoder, int32_t width, int32_t height )
指定解码图像的输出大小。
将来调用 AImageDecoder_decodeImage 将对编码图像进行采样或缩放以达到所需尺寸。如果设置了裁剪矩形(通过 AImageDecoder_setCrop),则它必须包含在 width 和 height 指定的维度内,并且输出图像将是裁剪矩形的尺寸。
如果编码图像表示动画,则必须在第一帧时调用此方法(例如,在调用 AImageDecoder_advanceFrame 之前或调用 AImageDecoder_rewind 之后)。
强烈建议仅对缩小使用 setTargetSize,因为由于总体内存减少,渲染时放大通常比预先放大更高效。
从 API level 30 开始可用。
错误
- ANDROID_IMAGE_DECODER_BAD_PARAMETER:AImageDecoder 为 null。
- ANDROID_IMAGE_DECODER_INVALID_SCALE:|width| 或 |height| <= 0,尺寸过大,任何现有裁剪未包含在新的图像维度内,或缩放与之前调用 AImageDecoder_setUnpremultipliedRequired(true) 不兼容。
- ANDROID_IMAGE_DECODER_INVALID_STATE:动画不在第一帧。
详细信息 | |||||||
---|---|---|---|---|---|---|---|
参数 |
|
||||||
返回 |
成功时返回 ANDROID_IMAGE_DECODER_SUCCESS 或指示失败原因的值。
|
AImageDecoder_setUnpremultipliedRequired
声明于android/imagedecoder.h
中
int AImageDecoder_setUnpremultipliedRequired( AImageDecoder *_Nonnull decoder, bool unpremultipliedRequired )
指定输出的像素是否应为未预乘。
默认情况下,如果像素具有 alpha,AImageDecoder_decodeImage 会对像素进行预乘。将 true 传递给此方法以使其保持未预乘状态。这对不透明图像没有影响。
如果编码图像表示动画,则必须在第一帧时调用此方法(例如,在调用 AImageDecoder_advanceFrame 之前或调用 AImageDecoder_rewind 之后)。
从 API level 30 开始可用。
错误
- ANDROID_IMAGE_DECODER_INVALID_CONVERSION:由于通过 AImageDecoder_setTargetSize 设置的现有缩放,无法进行未预乘。
- ANDROID_IMAGE_DECODER_BAD_PARAMETER:AImageDecoder 为 null。
- ANDROID_IMAGE_DECODER_INVALID_STATE:动画不在第一帧。
详细信息 | |||||
---|---|---|---|---|---|
参数 |
|
||||
返回 |
成功时返回 ANDROID_IMAGE_DECODER_SUCCESS 或指示失败原因的值。
|