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{
  ANDROID_IMAGE_DECODER_SUCCESS = 0,
  ANDROID_IMAGE_DECODER_INCOMPLETE = -1,
  ANDROID_IMAGE_DECODER_ERROR = -2,
  ANDROID_IMAGE_DECODER_INVALID_CONVERSION = -3,
  ANDROID_IMAGE_DECODER_INVALID_SCALE = -4,
  ANDROID_IMAGE_DECODER_BAD_PARAMETER = -5,
  ANDROID_IMAGE_DECODER_INVALID_INPUT = -6,
  ANDROID_IMAGE_DECODER_SEEK_ERROR = -7,
  ANDROID_IMAGE_DECODER_INTERNAL_ERROR = -8,
  ANDROID_IMAGE_DECODER_UNSUPPORTED_FORMAT = -9,
  ANDROID_IMAGE_DECODER_FINISHED = -10,
  ANDROID_IMAGE_DECODER_INVALID_STATE = -11
}
枚举
AImageDecoder 函数结果代码。
匿名枚举 29{
  ANDROID_IMAGE_DECODER_INFINITE = INT32_MAX
}
枚举
匿名枚举 30{
  ANDROID_IMAGE_DECODER_DISPOSE_OP_NONE = 1,
  ANDROID_IMAGE_DECODER_DISPOSE_OP_BACKGROUND = 2,
  ANDROID_IMAGE_DECODER_DISPOSE_OP_PREVIOUS = 3
}
枚举
在显示下一帧之前,如何“处置”当前帧。
匿名枚举 31{
  ANDROID_IMAGE_DECODER_BLEND_OP_SRC = 1,
  ANDROID_IMAGE_DECODER_BLEND_OP_SRC_OVER = 2
}
枚举
当前帧与上一帧的混合方式。

类型定义

AImageDecoder typedef
struct AImageDecoder
用于解码图像的不透明句柄。
AImageDecoderFrameInfo typedef
包含关于单个帧的动画信息的不透明句柄。
AImageDecoderHeaderInfo typedef
表示关于编码图像信息的不透明句柄。

函数

AImageDecoderFrameInfo_create()
创建一个未初始化的 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_getWidthAImageDecoderHeaderInfo_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
)

报告显示当前帧的纳秒数。

在 API 31 中引入。

错误

AImageDecoderFrameInfo_getFrameRect

声明于 android/imagedecoder.h
ARect AImageDecoderFrameInfo_getFrameRect(
  const AImageDecoderFrameInfo *_Nonnull info
)

此帧更新的图像矩形(范围为 0, 0, AImageDecoderHeaderInfo_getWidth, AImageDecoderHeaderInfo_getHeight)。

在 API 31 中引入。

请注意,这不受 AImageDecoder_setTargetSizeAImageDecoder_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_8888ANDROID_BITMAP_FORMAT_RGBA_F16

错误

详细信息
参数
decoder
一个 AImageDecoder 对象。
返回
成功时返回 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 开始可用。

错误

详细信息
参数
decoder
一个 AImageDecoder 对象。
sampleSize
原始图像的子采样率。必须大于或等于 1。sampleSize 为 2 意味着跳过每隔一个像素/行,导致宽度和高度为原始尺寸的 1/2,像素数为 1/4。
width
sampleSize 采样后的宽度输出参数,并以解码器可以最有效的方式进行四舍五入。
height
sampleSize 采样后的高度输出参数,并以解码器可以最有效的方式进行四舍五入。
返回
成功时返回 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 开始可用。

错误

详细信息
参数
asset
包含编码图像数据的 AAsset。客户端仍负责调用 AAsset_close,这可以在删除返回的 AImageDecoder 后完成。
outDecoder
成功时(即返回值是 ANDROID_IMAGE_DECODER_SUCCESS),此参数将设置为新创建的 AImageDecoder。调用者负责调用 AImageDecoder_delete
返回
成功时返回 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 开始可用。

错误

详细信息
参数
buffer
编码数据的指针。在使用 AImageDecoder 的整个期间必须有效。
length
缓冲区的字节长度。
outDecoder
成功时(即返回值是 ANDROID_IMAGE_DECODER_SUCCESS),此参数将设置为新创建的 AImageDecoder。调用者负责调用 AImageDecoder_delete
返回
成功时返回 ANDROID_IMAGE_DECODER_SUCCESS 或指示失败原因的值。

AImageDecoder_createFromFd

声明于 android/imagedecoder.h
int AImageDecoder_createFromFd(
  int fd,
  AImageDecoder *_Nullable *_Nonnull outDecoder
)

从文件描述符创建新的 AImageDecoder

从 API level 30 开始可用。

错误

详细信息
参数
fd
用于编码数据的可查找、可读、已打开的文件描述符。客户端仍负责关闭它,这可以在删除返回的 AImageDecoder 后完成。
outDecoder
成功时(即返回值是 ANDROID_IMAGE_DECODER_SUCCESS),此参数将设置为新创建的 AImageDecoder。调用者负责调用 AImageDecoder_delete
返回
成功时返回 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; }

错误

详细信息
参数
decoder
表示解码器的不透明对象。
pixels
成功时,将填充解码结果。必须足够大以容纳 |size| 字节。
stride
单行字节宽度。必须至少为 AImageDecoder_getMinimumStride,并且是所用 AndroidBitmapFormat 的每像素字节数的倍数。
size
像素缓冲区的字节大小。必须至少为 stride * (height - 1) + AImageDecoder_getMinimumStride
返回
成功时返回 ANDROID_IMAGE_DECODER_SUCCESS 或指示失败原因的值。

AImageDecoder_delete

声明于 android/imagedecoder.h
void AImageDecoder_delete(
  AImageDecoder *_Nullable decoder
)

删除 AImageDecoder。

详细信息
参数
decoder
使用 AImageDecoder_createFrom... 函数创建的 AImageDecoder 对象。从 API level 30 开始可用。

AImageDecoder_getFrameInfo

声明于 android/imagedecoder.h
int AImageDecoder_getFrameInfo(
  AImageDecoder *_Nonnull decoder,
  AImageDecoderFrameInfo *_Nonnull info
)

用有关当前帧的信息填充 |info|。

在 API 31 中引入。

最初,此方法将返回有关第一帧的信息。AImageDecoder_advanceFrameAImageDecoder_rewind 可用于更改当前帧。

如果图像只有一帧,此方法将使用编码信息和合理的默认值填充 AImageDecoderFrameInfo

如果 AImageDecoder_advanceFrame 成功,此方法也将成功。

错误

详细信息
参数
decoder
表示解码器的不透明对象。
info
用于保存帧信息的不透明对象。成功时,将填充有关当前帧的信息。
返回
成功时返回 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 开始可用。

详细信息
参数
decoder
一个 AImageDecoder 对象。

AImageDecoder_getMinimumStride

声明于 android/imagedecoder.h
size_t AImageDecoder_getMinimumStride(
  AImageDecoder *_Nonnull decoder
)

返回可以在 AImageDecoder_decodeImage 中使用的最小步幅。

此步幅不提供填充,这意味着它将完全等于宽度乘以所用 AndroidBitmapFormat 的每像素字节数。

如果输出被缩放(通过 AImageDecoder_setTargetSize)和/或裁剪(通过 AImageDecoder_setCrop),此方法会考虑这些因素。

从 API level 30 开始可用。

详细信息
参数
decoder
一个 AImageDecoder 对象。

AImageDecoder_getRepeatCount

声明于 android/imagedecoder.h
int32_t AImageDecoder_getRepeatCount(
  AImageDecoder *_Nonnull decoder
)

报告动画应重复多少次。

在 API 31 中引入。

这不包括首次播放。例如,重复计数为 4 意味着每帧播放 5 次。

ANDROID_IMAGE_DECODER_INFINITE 表示永远重复。

这可能需要查找。

对于非动画格式,此方法返回 0。如果编码图像包含重复计数,它可能对于只有一帧的图像返回非零值(即 AImageDecoder_isAnimated 返回 false)。

错误

详细信息
参数
decoder
一个 AImageDecoder 对象。
返回
成功时返回重复次数或指示失败原因的值。

AImageDecoder_isAnimated

声明于 android/imagedecoder.h
bool AImageDecoder_isAnimated(
  AImageDecoder *_Nonnull decoder
)

如果图像是动画(即有多帧),则返回 true。

有多帧。

在 API 31 中引入。

单帧 GIF 被认为不是动画。这可能需要查找第一帧之后是否存在下一帧来验证。

错误

  • 如果 |decoder| 为 null,则返回 false。

详细信息
参数
decoder
一个 AImageDecoder 对象。

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 将准备好解码动画的第一帧。可以在到达动画末尾、发生错误或动画中间时调用此方法。

错误

详细信息
参数
decoder
一个 AImageDecoder 对象。
返回
成功时返回 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 开始可用。

错误

详细信息
参数
format
用于输出的 AndroidBitmapFormat
decoder
一个 AImageDecoder 对象。
返回
成功时返回 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 开始可用。

错误

详细信息
参数
decoder
一个 AImageDecoder 对象。
crop
描述解码裁剪的矩形。它必须包含在(可能通过 AImageDecoder_setTargetSize 缩放的)图像维度内。这将影响将来对 AImageDecoder_getMinimumStride 的调用,该方法现在将根据裁剪的宽度返回一个值。空的 ARect(具体来说是 { 0, 0, 0, 0 })可用于移除裁剪行为。任何其他空或未排序的 ARects 都将导致返回 ANDROID_IMAGE_DECODER_BAD_PARAMETER
返回
成功时返回 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 开始可用。

错误

详细信息
参数
decoder
一个 AImageDecoder 对象。
dataspace
要解码到的 ADataSpace。ADataSpace 指定了如何解释颜色。默认情况下,AImageDecoder 会解码到 AImageDecoderHeaderInfo_getDataSpace 指定的 ADataSpace。如果此参数设置为不同的 ADataSpace,AImageDecoder 将把输出转换为指定的 ADataSpace。
返回
成功时返回 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。

详细信息
参数
decoder
一个 AImageDecoder 对象。
handleInternally
AImageDecoder 是否在内部处理 ANDROID_IMAGE_DECODER_DISPOSE_OP_PREVIOUS 帧。

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 开始可用。

错误

详细信息
参数
decoder
一个 AImageDecoder 对象。
width
输出宽度(裁剪前)。这将影响将来对 AImageDecoder_getMinimumStride 的调用,该方法现在将根据此宽度返回一个值。
height
输出高度(裁剪前)。
返回
成功时返回 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 开始可用。

错误

详细信息
参数
decoder
一个 AImageDecoder 对象。
unpremultipliedRequired
传递 true 以保持像素未预乘。
返回
成功时返回 ANDROID_IMAGE_DECODER_SUCCESS 或指示失败原因的值。