# Android Image Decoder

Functions for converting encoded images into RGBA pixels.

## Summary

Similar to the Java counterpart android.graphics.ImageDecoder, it can be used to decode images in the following formats:

- JPEG
- PNG
- GIF
- WebP
- BMP
- ICO
- WBMP
- HEIF
- Digital negatives (via the DNG SDK)

<br />

It has similar options for scaling, cropping, and choosing the output format. Unlike the Java API, which can create an android.graphics.Bitmap or android.graphics.drawable.Drawable object, AImageDecoder decodes directly into memory provided by the client. For more information, see the [Image decoder](https://developer.android.com/ndk/guides/image-decoder) developer guide.

| ### Enumerations ||
|---|---|
| `https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gaac34dfe6c6b73b43a4656c9dce041034{ https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a0ec2d288909a072d3a6d0d82d20cc3bc = 0, https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a988522e05099ed82618dc19c84d8686f = -1, https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034aef2336a9ed6ba81489ead4b14d45d03d = -2, https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a01038add3845072fc6a3e7dc66d38cec = -3, https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034ad1f8effc2dc250a7ed2547232eea38d8 = -4, https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a7df684b4836d11310421dd456363f383 = -5, https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034aa5369e0955007f52cd5d37d6dca891d1 = -6, https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a6d697e48474b9af2a0dabb82a18ff698 = -7, https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a7a552d3a63135ac06d0437b2c66a8f1e = -8, https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a58bbc3ecdc072989e970449fa90fb938 = -9, https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a9e3a7e4e6016aa9237e99ab795245bad = -10, https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a0e1f2b528e0ba161075182fda7dbcf8e = -11 }` | enum[AImageDecoder](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149) functions result code. |
| `https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga0ed680fdb405e7195d9f14032851eebb{ https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gga0ed680fdb405e7195d9f14032851eebba053f59787fb53a29ddca96532f2bdc5e = INT32_MAX }` | enum |
| `https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga0944a4353780132eeab7b06e3e42291d{ https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gga0944a4353780132eeab7b06e3e42291dad08192d373eefc3e851110a6042ee18a = 1, https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gga0944a4353780132eeab7b06e3e42291dac9df2a20c7286a3953eba8397148c26b = 2, https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gga0944a4353780132eeab7b06e3e42291dab6f94b11c70ce372ff8139542b952c0b = 3 }` | enumHow a frame is "disposed" before showing the next one. |
| `https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga4790f45dcc812c1b00184a2edccdddf5{ https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gga4790f45dcc812c1b00184a2edccdddf5a50743026b2d2486802090fba4cb63a6c = 1, https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gga4790f45dcc812c1b00184a2edccdddf5a65d4b37a0df54fd069874218235b18bd = 2 }` | enumHow a frame is blended with the previous frame. |

| ### Typedefs ||
|---|---|
| `https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149` | typedef `struct https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149` Opaque handle for decoding images. |
| `https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gae32203111ad776eaca2a30a88343711b` | typedef `struct https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gae32203111ad776eaca2a30a88343711b` Opaque handle to animation information about a single frame. |
| `https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga2daafc6dde650ec1f77afc65fd88030e` | typedef `struct https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga2daafc6dde650ec1f77afc65fd88030e` Opaque handle for representing information about the encoded image. |

| ### Functions ||
|---|---|
| `https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gabaaa47b098011adf6f0c2be10fdda345()` | `https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gae32203111ad776eaca2a30a88343711b *https://developer.android.com/ndk/reference/group/ndk-binder#group___ndk_binder_1ga0890a8f74983b96e76f6b8748543032d` Create an uninitialized AImageDecoderFrameInfo. |
| `https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gacb3b9066c027d7f51f3bc66bd7ee4f7c(https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gae32203111ad776eaca2a30a88343711b *https://developer.android.com/ndk/reference/group/ndk-binder#group___ndk_binder_1ga0890a8f74983b96e76f6b8748543032d info)` | `void` Delete an AImageDecoderFrameInfo. |
| `https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gaa3541c4f82d18ff088b9ef363995e452(const https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gae32203111ad776eaca2a30a88343711b *_Nonnull info)` | `int32_t` Return how this frame is blended with the previous frame. |
| `https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga255f92cb99d101b1e69b4cd82cbb6fb6(const https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gae32203111ad776eaca2a30a88343711b *_Nonnull info)` | `int32_t` Return how this frame is "disposed" before showing the next one. |
| `https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga4556e0e70538befd8fac73109114f2b8(const https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gae32203111ad776eaca2a30a88343711b *_Nonnull info)` | `int64_t` Report the number of nanoseconds to show the current frame. |
| `https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gaa5b881fcb6433bf2041a41f8def49f44(const https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gae32203111ad776eaca2a30a88343711b *_Nonnull info)` | `https://developer.android.com/ndk/reference/struct/a-rect#struct_a_rect` The rectangle of the image (within 0, 0, [AImageDecoderHeaderInfo_getWidth](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga8d0272a024ac9153f4374a168d6465d9), [AImageDecoderHeaderInfo_getHeight](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gad0ed8bbf22fa0d522aea20f4928bb9aa)) updated by this frame. |
| `https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gacdf8903fa408c55e3d9c2285a02035d6(const https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gae32203111ad776eaca2a30a88343711b *_Nonnull info)` | `bool` Whether the new portion of this frame may contain alpha. |
| `https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gaa0637d1e3aee6828c2e5179b0b5448e2(const https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga2daafc6dde650ec1f77afc65fd88030e *_Nonnull)` | `int` Report how the [AImageDecoder](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149) will handle alpha by default. |
| `https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gaa70fb5445c4f96cd0787af704a63d86e(const https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga2daafc6dde650ec1f77afc65fd88030e *_Nonnull)` | `int32_t` Report the [AndroidBitmapFormat](https://developer.android.com/ndk/reference/group/bitmap#group___bitmap_1gaea286a2d4c61ae2abb02b51500499f13) the AImageDecoder will decode to by default. |
| `https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga51c830b3051a670e7ed3fd78574d3dd5(const https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga2daafc6dde650ec1f77afc65fd88030e *_Nonnull)` | `int32_t` Report the dataspace the AImageDecoder will decode to by default. |
| `https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gad0ed8bbf22fa0d522aea20f4928bb9aa(const https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga2daafc6dde650ec1f77afc65fd88030e *_Nonnull)` | `int32_t` Report the native height of the encoded image. |
| `https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga258b11098e7a7d1e689fdcafcdaa4cf1(const https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga2daafc6dde650ec1f77afc65fd88030e *_Nonnull)` | `const char *_Nonnull` Report the mimeType of the encoded image. |
| `https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga8d0272a024ac9153f4374a168d6465d9(const https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga2daafc6dde650ec1f77afc65fd88030e *_Nonnull)` | `int32_t` Report the native width of the encoded image. |
| `https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga1910429b53cf1ec1eca588ad9cee354f(https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149 *_Nonnull decoder)` | `int` Advance to the next frame in the animation. |
| `https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga6aa2f279d7b365386279483ee2a9ac6e(const https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149 *_Nonnull decoder, int sampleSize, int32_t *_Nonnull width, int32_t *_Nonnull height)` | `int` Compute the dimensions to use for a given sampleSize. |
| `https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gae0849d5a30958fb39ae5a773d313fb70(struct https://developer.android.com/ndk/reference/group/asset#group___asset_1ga5630b1f1aa5cd363303018cb2f12f95c *_Nonnull asset, https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149 *https://developer.android.com/ndk/reference/group/ndk-binder#group___ndk_binder_1ga0890a8f74983b96e76f6b8748543032d *_Nonnull outDecoder)` | `int` Create a new [AImageDecoder](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149) from an [AAsset](https://developer.android.com/ndk/reference/group/asset#group___asset_1ga5630b1f1aa5cd363303018cb2f12f95c). |
| `https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga069d2d1326863d9ad661e4f12267ab11(const void *_Nonnull buffer, size_t length, https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149 *https://developer.android.com/ndk/reference/group/ndk-binder#group___ndk_binder_1ga0890a8f74983b96e76f6b8748543032d *_Nonnull outDecoder)` | `int` Create a new AImageDecoder from a buffer. |
| `https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga6e4d1439ee1f0b2912db23bb2f6d8d6e(int fd, https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149 *https://developer.android.com/ndk/reference/group/ndk-binder#group___ndk_binder_1ga0890a8f74983b96e76f6b8748543032d *_Nonnull outDecoder)` | `int` Create a new [AImageDecoder](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149) from a file descriptor. |
| `https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gaf281588607767ff1232c704c7f7d57ec(https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149 *_Nonnull decoder, void *_Nonnull pixels, size_t stride, size_t size)` | `int` Decode the image into pixels, using the settings of the [AImageDecoder](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149). |
| `https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga682bf61cf79b1946a790f709339815a6(https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149 *https://developer.android.com/ndk/reference/group/ndk-binder#group___ndk_binder_1ga0890a8f74983b96e76f6b8748543032d decoder)` | `void` Delete the AImageDecoder. |
| `https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga78e3c58f2a05e2eb47fe4d6953d50c61(https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149 *_Nonnull decoder, https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gae32203111ad776eaca2a30a88343711b *_Nonnull info)` | `int` Fill \|info\| with information about the current frame. |
| `https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga20f8318706f26b9f4fc58d2c73244866(const https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149 *_Nonnull decoder)` | `const https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga2daafc6dde650ec1f77afc65fd88030e *_Nonnull` Return an opaque handle for reading header info. |
| `https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga19a382126186c0aebb46271b5852bb9d(https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149 *_Nonnull decoder)` | `size_t` Return the minimum stride that can be used in [AImageDecoder_decodeImage](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gaf281588607767ff1232c704c7f7d57ec). |
| `https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga966f4cabd7d08072e70cb161c5c6ebf4(https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149 *_Nonnull decoder)` | `int32_t` Report how many times the animation should repeat. |
| `https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga1aa5cb1fc59567844ebcf7239e47b52d(https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149 *_Nonnull decoder)` | `bool` Return true iff the image is animated - i.e. |
| `https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga500dbb2ef6955aa8f5f9d241ccaebe4f(int)` | `const char *https://developer.android.com/ndk/reference/group/ndk-binder#group___ndk_binder_1ga0890a8f74983b96e76f6b8748543032d` Return a constant string value representing the error code. |
| `https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gaa89204e46d09c849d457eea8ea74e28c(https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149 *_Nonnull decoder)` | `int` Return to the beginning of the animation. |
| `https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga3c9b8d6606fd563222b7a910351ff686(https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149 *_Nonnull decoder, int32_t format)` | `int` Choose the desired output format. |
| `https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga1adf67d55755c99752ba9ea08227533e(https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149 *_Nonnull decoder, https://developer.android.com/ndk/reference/struct/a-rect#struct_a_rect crop)` | `int` Specify how to crop the output after scaling (if any). |
| `https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga59268d38b603654858f109dde8a8ef9f(https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149 *_Nonnull decoder, int32_t dataspace)` | `int` Choose the dataspace for the output. |
| `https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga6afda5e1bf6f91836d805389c2c12ce3(https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149 *_Nonnull decoder, bool handleInternally)` | `void` Whether to have AImageDecoder store the frame prior to a frame marked [ANDROID_IMAGE_DECODER_DISPOSE_OP_PREVIOUS](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gga0944a4353780132eeab7b06e3e42291dab6f94b11c70ce372ff8139542b952c0b). |
| `https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga6b3a3e63ae5544416511357b5a1db0c3(https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149 *_Nonnull decoder, int32_t width, int32_t height)` | `int` Specify the output size for a decoded image. |
| `https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gaa08fb75e5e7b906e12cfa94d4b745a34(https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149 *_Nonnull decoder, bool unpremultipliedRequired)` | `int` Specify whether the output's pixels should be unpremultiplied. |

## Enumerations

### Anonymous Enum 29

Declared in `android/imagedecoder.h`

```
 Anonymous Enum 29
```
[AImageDecoder](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149) functions result code.

Introduced in API 30.

Many functions will return this to indicate success ([ANDROID_IMAGE_DECODER_SUCCESS](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a0ec2d288909a072d3a6d0d82d20cc3bc)) or the reason for the failure. On failure, any out-parameters should be considered uninitialized, except where specified. Use [AImageDecoder_resultToString](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga500dbb2ef6955aa8f5f9d241ccaebe4f) for a readable version of the result code.

| Properties ||
|---|---|
| `ANDROID_IMAGE_DECODER_BAD_PARAMETER` | Some other parameter is invalid. |
| `ANDROID_IMAGE_DECODER_ERROR` | The input contained an error after decoding some lines. |
| `ANDROID_IMAGE_DECODER_FINISHED` | The animation has reached the end. |
| `ANDROID_IMAGE_DECODER_INCOMPLETE` | The input is incomplete. |
| `ANDROID_IMAGE_DECODER_INTERNAL_ERROR` | Some other error. For example, an internal allocation failed. |
| `ANDROID_IMAGE_DECODER_INVALID_CONVERSION` | Could not convert. For example, attempting to decode an image with alpha to an opaque format. |
| `ANDROID_IMAGE_DECODER_INVALID_INPUT` | Input was invalid before decoding any pixels. |
| `ANDROID_IMAGE_DECODER_INVALID_SCALE` | The scale is invalid. It may have overflowed, or it may be incompatible with the current alpha setting. |
| `ANDROID_IMAGE_DECODER_INVALID_STATE` | This method cannot be called while the AImageDecoder is in its current state. For example, various setters (like [AImageDecoder_setTargetSize](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga6b3a3e63ae5544416511357b5a1db0c3)) can only be called while the AImageDecoder is set to decode the first frame of an animation. This ensures that any blending and/or restoring prior frames works correctly. |
| `ANDROID_IMAGE_DECODER_SEEK_ERROR` | A seek was required and it failed. |
| `ANDROID_IMAGE_DECODER_SUCCESS` | Decoding was successful and complete. |
| `ANDROID_IMAGE_DECODER_UNSUPPORTED_FORMAT` | AImageDecoder did not recognize the format. |

### Anonymous Enum 30

Declared in `android/imagedecoder.h`

```
 Anonymous Enum 30
```

| Properties ||
|---|---|
| `ANDROID_IMAGE_DECODER_INFINITE` | Reported by [AImageDecoder_getRepeatCount](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga966f4cabd7d08072e70cb161c5c6ebf4) if the animation should repeat forever. Introduced in API 31 |

### Anonymous Enum 31

Declared in `android/imagedecoder.h`

```
 Anonymous Enum 31
```
How a frame is "disposed" before showing the next one.

Introduced in API 31.

This, along with other information in AImageDecoderFrameInfo, can be useful for determining whether a frame is independent, but the decoder handles disposing of frames, so a simple sequential client does not need this.

| Properties ||
|---|---|
| `ANDROID_IMAGE_DECODER_DISPOSE_OP_BACKGROUND` | The frame's rectangle is cleared to transparent (by AImageDecoder) before decoding the next frame. |
| `ANDROID_IMAGE_DECODER_DISPOSE_OP_NONE` | No disposal. The following frame will be drawn directly on top of this one. |
| `ANDROID_IMAGE_DECODER_DISPOSE_OP_PREVIOUS` | The frame's rectangle is reverted to the prior frame before decoding the next frame. This is handled by AImageDecoder, unless [AImageDecoder_setInternallyHandleDisposePrevious](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga6afda5e1bf6f91836d805389c2c12ce3) is set to false. |

### Anonymous Enum 32

Declared in `android/imagedecoder.h`

```
 Anonymous Enum 32
```
How a frame is blended with the previous frame.

Introduced in API 31.

This, along with other information in AImageDecoderFrameInfo, can be useful for determining whether a frame is independent, but the decoder handles blending frames, so a simple sequential client does not need this.

| Properties ||
|---|---|
| `ANDROID_IMAGE_DECODER_BLEND_OP_SRC` | This frame replaces existing content. This corresponds to webp's "do not blend". |
| `ANDROID_IMAGE_DECODER_BLEND_OP_SRC_OVER` | This frame blends with the previous frame. |

## Typedefs

### AImageDecoder

Declared in `android/imagedecoder.h`

```
struct AImageDecoder AImageDecoder
```
Opaque handle for decoding images.

Introduced in API 30

Create using one of the following:

- [AImageDecoder_createFromAAsset](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gae0849d5a30958fb39ae5a773d313fb70)
- [AImageDecoder_createFromFd](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga6e4d1439ee1f0b2912db23bb2f6d8d6e)
- [AImageDecoder_createFromBuffer](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga069d2d1326863d9ad661e4f12267ab11)

<br />

After creation, [AImageDecoder_getHeaderInfo](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga20f8318706f26b9f4fc58d2c73244866) can be used to retrieve information about the encoded image. Other functions, like [AImageDecoder_setTargetSize](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga6b3a3e63ae5544416511357b5a1db0c3), can be used to specify how to decode, and [AImageDecoder_decodeImage](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gaf281588607767ff1232c704c7f7d57ec) will decode into client provided memory.

[AImageDecoder](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149) objects are NOT thread-safe, and should not be shared across threads.

### AImageDecoderFrameInfo

Declared in `android/imagedecoder.h`

```
struct AImageDecoderFrameInfo AImageDecoderFrameInfo
```
Opaque handle to animation information about a single frame.

Introduced in API 31

The duration (retrieved with [AImageDecoderFrameInfo_getDuration](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga4556e0e70538befd8fac73109114f2b8)) is necessary for clients to display the animation at the proper speed. The other information is helpful for a client that wants to determine what frames are independent (or what frames they depend on), but is unnecessary for a simple client that wants to sequentially display all frames.

### AImageDecoderHeaderInfo

Declared in `android/imagedecoder.h`

```
struct AImageDecoderHeaderInfo AImageDecoderHeaderInfo
```
Opaque handle for representing information about the encoded image.

Introduced in API 30

Retrieved using [AImageDecoder_getHeaderInfo](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga20f8318706f26b9f4fc58d2c73244866) and passed to methods like [AImageDecoderHeaderInfo_getWidth](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga8d0272a024ac9153f4374a168d6465d9) and [AImageDecoderHeaderInfo_getHeight](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gad0ed8bbf22fa0d522aea20f4928bb9aa).

## Functions

### AImageDecoderFrameInfo_create

Declared in `android/imagedecoder.h`

```
AImageDecoderFrameInfo *_Nullable AImageDecoderFrameInfo_create()
```
Create an uninitialized AImageDecoderFrameInfo.

Introduced in API 31.

This can be passed to [AImageDecoder_getFrameInfo](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga78e3c58f2a05e2eb47fe4d6953d50c61) to fill in information about the current frame. It may be reused.

Must be deleted with [AImageDecoderFrameInfo_delete](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gacb3b9066c027d7f51f3bc66bd7ee4f7c).

### AImageDecoderFrameInfo_delete

Declared in `android/imagedecoder.h`

```
void AImageDecoderFrameInfo_delete(
  AImageDecoderFrameInfo *_Nullable info
)
```
Delete an AImageDecoderFrameInfo.

Introduced in API 31.

### AImageDecoderFrameInfo_getBlendOp

Declared in `android/imagedecoder.h`

```
int32_t AImageDecoderFrameInfo_getBlendOp(
  const AImageDecoderFrameInfo *_Nonnull info
)
```
Return how this frame is blended with the previous frame.

Introduced in API 31.

This, along with other information in AImageDecoderFrameInfo, can be useful for determining whether a frame is independent, but the decoder handles blending frames, so a simple sequential client does not need this.

<br />

| Details ||
|---|---|
| **Returns** | one of: - [ANDROID_IMAGE_DECODER_BLEND_OP_SRC](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gga4790f45dcc812c1b00184a2edccdddf5a50743026b2d2486802090fba4cb63a6c) - [ANDROID_IMAGE_DECODER_BLEND_OP_SRC_OVER](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gga4790f45dcc812c1b00184a2edccdddf5a65d4b37a0df54fd069874218235b18bd) Errors: - [ANDROID_IMAGE_DECODER_BAD_PARAMETER](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a7df684b4836d11310421dd456363f383) if \|info\| is null. |

### AImageDecoderFrameInfo_getDisposeOp

Declared in `android/imagedecoder.h`

```
int32_t AImageDecoderFrameInfo_getDisposeOp(
  const AImageDecoderFrameInfo *_Nonnull info
)
```
Return how this frame is "disposed" before showing the next one.

Introduced in API 31.

This, along with other information in AImageDecoderFrameInfo, can be useful for determining whether a frame is independent, but the decoder handles disposing of frames, so a simple sequential client does not need this.

<br />

| Details ||
|---|---|
| **Returns** | one of: - [ANDROID_IMAGE_DECODER_DISPOSE_OP_NONE](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gga0944a4353780132eeab7b06e3e42291dad08192d373eefc3e851110a6042ee18a) - [ANDROID_IMAGE_DECODER_DISPOSE_OP_BACKGROUND](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gga0944a4353780132eeab7b06e3e42291dac9df2a20c7286a3953eba8397148c26b) - [ANDROID_IMAGE_DECODER_DISPOSE_OP_PREVIOUS](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gga0944a4353780132eeab7b06e3e42291dab6f94b11c70ce372ff8139542b952c0b) Errors: - [ANDROID_IMAGE_DECODER_BAD_PARAMETER](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a7df684b4836d11310421dd456363f383) if \|info\| is null. |

### AImageDecoderFrameInfo_getDuration

Declared in `android/imagedecoder.h`

```
int64_t AImageDecoderFrameInfo_getDuration(
  const AImageDecoderFrameInfo *_Nonnull info
)
```
Report the number of nanoseconds to show the current frame.

Introduced in API 31.

Errors:

- returns [ANDROID_IMAGE_DECODER_BAD_PARAMETER](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a7df684b4836d11310421dd456363f383) if \|info\| is null.

<br />

### AImageDecoderFrameInfo_getFrameRect

Declared in `android/imagedecoder.h`

```
ARect AImageDecoderFrameInfo_getFrameRect(
  const AImageDecoderFrameInfo *_Nonnull info
)
```
The rectangle of the image (within 0, 0, [AImageDecoderHeaderInfo_getWidth](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga8d0272a024ac9153f4374a168d6465d9), [AImageDecoderHeaderInfo_getHeight](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gad0ed8bbf22fa0d522aea20f4928bb9aa)) updated by this frame.

Introduced in API 31.

Note that this is unaffected by calls to [AImageDecoder_setTargetSize](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga6b3a3e63ae5544416511357b5a1db0c3) or [AImageDecoder_setCrop](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga1adf67d55755c99752ba9ea08227533e).

A frame may update only part of the image. This will always be contained by the image's dimensions.

This, along with other information in AImageDecoderFrameInfo, can be useful for determining whether a frame is independent, but the decoder handles blending frames, so a simple sequential client does not need this.

Errors:

- returns an empty [ARect](https://developer.android.com/ndk/reference/struct/a-rect#struct_a_rect) if \|info\| is null.

<br />

### AImageDecoderFrameInfo_hasAlphaWithinBounds

Declared in `android/imagedecoder.h`

```
bool AImageDecoderFrameInfo_hasAlphaWithinBounds(
  const AImageDecoderFrameInfo *_Nonnull info
)
```
Whether the new portion of this frame may contain alpha.

Introduced in API 31.

Unless this frame is independent (see [AImageDecoder_decodeImage](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gaf281588607767ff1232c704c7f7d57ec)), a single call to [AImageDecoder_decodeImage](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gaf281588607767ff1232c704c7f7d57ec) will decode an updated rectangle of pixels and then blend it with the existing pixels in the \|pixels\| buffer according to [AImageDecoderFrameInfo_getBlendOp](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gaa3541c4f82d18ff088b9ef363995e452). This method returns whether the updated rectangle has alpha, prior to blending. The return value is conservative; for example, if a color-index-based frame has a color with alpha but does not use it, this will still return true.

This, along with other information in AImageDecoderFrameInfo, can be useful for determining whether a frame is independent, but the decoder handles blending frames, so a simple sequential client does not need this.

Note that this may differ from whether the composed frame (that is, the resulting image after blending) has alpha. If this frame does not fill the entire image dimensions (see [AImageDecoderFrameInfo_getFrameRect](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gaa5b881fcb6433bf2041a41f8def49f44)) or it blends with an opaque frame, for example, the composed frame's alpha may not match.

Errors:

- returns false if \|info\| is null.

<br />

### AImageDecoderHeaderInfo_getAlphaFlags

Declared in `android/imagedecoder.h`

```
int AImageDecoderHeaderInfo_getAlphaFlags(
  const AImageDecoderHeaderInfo *_Nonnull
)
```
Report how the [AImageDecoder](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149) will handle alpha by default.

If the image contains no alpha (according to its header), this will return [ANDROID_BITMAP_FLAGS_ALPHA_OPAQUE](https://developer.android.com/ndk/reference/group/bitmap#group___bitmap_1ggaaf8fd5f0e57d456151c951e0f3715fc4af63df9ce342932ad1d117996cb3366f0). If the image may contain alpha, this returns [ANDROID_BITMAP_FLAGS_ALPHA_PREMUL](https://developer.android.com/ndk/reference/group/bitmap#group___bitmap_1ggaaf8fd5f0e57d456151c951e0f3715fc4a262bdd405b14647013af4f6a445188ca), because [AImageDecoder_decodeImage](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gaf281588607767ff1232c704c7f7d57ec) will premultiply pixels by default.

Available since API level 30.

Starting in API level 31, an AImageDecoder may contain multiple frames of an animation, but this method still only reports whether the first frame has alpha.

### AImageDecoderHeaderInfo_getAndroidBitmapFormat

Declared in `android/imagedecoder.h`

```
int32_t AImageDecoderHeaderInfo_getAndroidBitmapFormat(
  const AImageDecoderHeaderInfo *_Nonnull
)
```
Report the [AndroidBitmapFormat](https://developer.android.com/ndk/reference/group/bitmap#group___bitmap_1gaea286a2d4c61ae2abb02b51500499f13) the AImageDecoder will decode to by default.

[AImageDecoder](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149) will try to choose one that is sensible for the image and the system. Note that this does not indicate the encoded format of the image.

Available since API level 30.

### AImageDecoderHeaderInfo_getDataSpace

Declared in `android/imagedecoder.h`

```
int32_t AImageDecoderHeaderInfo_getDataSpace(
  const AImageDecoderHeaderInfo *_Nonnull
)
```
Report the dataspace the AImageDecoder will decode to by default.

By default, [AImageDecoder_decodeImage](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gaf281588607767ff1232c704c7f7d57ec) will not do any color conversion.

Available since API level 30.


Note that ADataSpace only exposes a few values. This may return [ADATASPACE_UNKNOWN](https://developer.android.com/ndk/reference/group/a-data-space#group___a_data_space_1gga31c2db141423db19c32a3176e7a91adea1ed631bf9863a3744507ddc5bdd1e66a), even for Named ColorSpaces, if they have no corresponding [ADataSpace](https://developer.android.com/ndk/reference/group/a-data-space#group___a_data_space).

| Details ||
|---|---|
| **Returns** | The [ADataSpace](https://developer.android.com/ndk/reference/group/a-data-space#group___a_data_space) representing the way the colors are encoded (or [ADATASPACE_UNKNOWN](https://developer.android.com/ndk/reference/group/a-data-space#group___a_data_space_1gga31c2db141423db19c32a3176e7a91adea1ed631bf9863a3744507ddc5bdd1e66a) if there is not a corresponding ADataSpace). This specifies how to interpret the colors in the decoded image, unless [AImageDecoder_setDataSpace](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga59268d38b603654858f109dde8a8ef9f) is called to decode to a different ADataSpace. |

### AImageDecoderHeaderInfo_getHeight

Declared in `android/imagedecoder.h`

```
int32_t AImageDecoderHeaderInfo_getHeight(
  const AImageDecoderHeaderInfo *_Nonnull
)
```
Report the native height of the encoded image.

This is also the logical pixel height of the output, unless [AImageDecoder_setTargetSize](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga6b3a3e63ae5544416511357b5a1db0c3) is used to choose a different size or [AImageDecoder_setCrop](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga1adf67d55755c99752ba9ea08227533e) is used to set a crop rect.

Available since API level 30.

### AImageDecoderHeaderInfo_getMimeType

Declared in `android/imagedecoder.h`

```
const char *_Nonnull AImageDecoderHeaderInfo_getMimeType(
  const AImageDecoderHeaderInfo *_Nonnull
)
```
Report the mimeType of the encoded image.

Available since API level 30.

<br />

| Details ||
|---|---|
| **Returns** | a string literal describing the mime type. |

### AImageDecoderHeaderInfo_getWidth

Declared in `android/imagedecoder.h`

```
int32_t AImageDecoderHeaderInfo_getWidth(
  const AImageDecoderHeaderInfo *_Nonnull
)
```
Report the native width of the encoded image.

This is also the logical pixel width of the output, unless [AImageDecoder_setTargetSize](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga6b3a3e63ae5544416511357b5a1db0c3) is used to choose a different size or [AImageDecoder_setCrop](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga1adf67d55755c99752ba9ea08227533e) is used to set a crop rect.

Available since API level 30.

### AImageDecoder_advanceFrame

Declared in `android/imagedecoder.h`

```
int AImageDecoder_advanceFrame(
  AImageDecoder *_Nonnull decoder
)
```
Advance to the next frame in the animation.

Introduced in API 31.

The AImageDecoder keeps track internally which frame it is ready to decode (the "current frame"). Initially it is set to decode the first frame, and each call to [AImageDecoder_decodeImage](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gaf281588607767ff1232c704c7f7d57ec) will continue to decode the same frame until this method (or [AImageDecoder_rewind](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gaa89204e46d09c849d457eea8ea74e28c)) is called.

Note that this can be used to skip a frame without decoding it. But some frames depend on (i.e. blend with) prior frames, and AImageDecoder_decodeImage assumes that the prior frame is in the \|pixels\| buffer. In addition, AImageDecoder_decodeImage handles caching and restoring frames (see [ANDROID_IMAGE_DECODER_DISPOSE_OP_PREVIOUS](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gga0944a4353780132eeab7b06e3e42291dab6f94b11c70ce372ff8139542b952c0b)), so skipping frames in an image with such frames may not produce the correct results.

Only supported by [ANDROID_BITMAP_FORMAT_RGBA_8888](https://developer.android.com/ndk/reference/group/bitmap#group___bitmap_1ggaea286a2d4c61ae2abb02b51500499f13ab92ae96ceea06aa534583beadba84057) and [ANDROID_BITMAP_FORMAT_RGBA_F16](https://developer.android.com/ndk/reference/group/bitmap#group___bitmap_1ggaea286a2d4c61ae2abb02b51500499f13a7df3845005da3e2d18b1f260b9eb625d).


Errors:

- [ANDROID_IMAGE_DECODER_BAD_PARAMETER](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a7df684b4836d11310421dd456363f383): The AImageDecoder represents an image that is not animated (see [AImageDecoder_isAnimated](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga1aa5cb1fc59567844ebcf7239e47b52d)) or the AImageDecoder is null.
- [The requested AndroidBitmapFormat](https://developer.android.com/ndk/reference//) does not support animation.
- [ANDROID_IMAGE_DECODER_INCOMPLETE](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a988522e05099ed82618dc19c84d8686f): The input appears to be truncated. The client must call [AImageDecoder_rewind](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gaa89204e46d09c849d457eea8ea74e28c) before calling [AImageDecoder_decodeImage](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gaf281588607767ff1232c704c7f7d57ec) again.
- [ANDROID_IMAGE_DECODER_ERROR](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034aef2336a9ed6ba81489ead4b14d45d03d): The input contains an error. The client must call [AImageDecoder_rewind](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gaa89204e46d09c849d457eea8ea74e28c) before calling [AImageDecoder_decodeImage](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gaf281588607767ff1232c704c7f7d57ec) again.
- [ANDROID_IMAGE_DECODER_FINISHED](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a9e3a7e4e6016aa9237e99ab795245bad): The input contains no more frames. The client must call [AImageDecoder_rewind](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gaa89204e46d09c849d457eea8ea74e28c) before calling [AImageDecoder_decodeImage](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gaf281588607767ff1232c704c7f7d57ec) again.

<br />

Details Parameters `decoder` an [AImageDecoder](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149) object. **Returns** [ANDROID_IMAGE_DECODER_SUCCESS](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a0ec2d288909a072d3a6d0d82d20cc3bc) on success or a value indicating the reason for the failure.

### AImageDecoder_computeSampledSize

Declared in `android/imagedecoder.h`

```
int AImageDecoder_computeSampledSize(
  const AImageDecoder *_Nonnull decoder,
  int sampleSize,
  int32_t *_Nonnull width,
  int32_t *_Nonnull height
)
```
Compute the dimensions to use for a given sampleSize.

Although AImageDecoder can scale to an arbitrary target size (see [AImageDecoder_setTargetSize](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga6b3a3e63ae5544416511357b5a1db0c3)), some sizes may be more efficient than others. This computes the most efficient target size to use to reach a particular sampleSize.

Available since API level 30.


Errors:

- [ANDROID_IMAGE_DECODER_BAD_PARAMETER](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a7df684b4836d11310421dd456363f383): The [AImageDecoder](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149), \|width\| or \|height\| is null or \|sampleSize\| is \< 1.

<br />

Details Parameters `decoder` an [AImageDecoder](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149) object. `sampleSize` A subsampling rate of the original image. Must be greater than or equal to 1. A sampleSize of 2 means to skip every other pixel/line, resulting in a width and height that are 1/2 of the original dimensions, with 1/4 the number of pixels. `width` Out parameter for the width sampled by sampleSize, and rounded in the direction that the decoder can do most efficiently. `height` Out parameter for the height sampled by sampleSize, and rounded in the direction that the decoder can do most efficiently. **Returns** [ANDROID_IMAGE_DECODER_SUCCESS](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a0ec2d288909a072d3a6d0d82d20cc3bc) on success or a value indicating the reason for the failure.

### AImageDecoder_createFromAAsset

Declared in `android/imagedecoder.h`

```
int AImageDecoder_createFromAAsset(
  struct AAsset *_Nonnull asset,
  AImageDecoder *_Nullable *_Nonnull outDecoder
)
```
Create a new [AImageDecoder](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149) from an [AAsset](https://developer.android.com/ndk/reference/group/asset#group___asset_1ga5630b1f1aa5cd363303018cb2f12f95c).

Available since API level 30.


Errors:

- [ANDROID_IMAGE_DECODER_INCOMPLETE](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a988522e05099ed82618dc19c84d8686f): The asset was truncated before reading the image header.
- [ANDROID_IMAGE_DECODER_BAD_PARAMETER](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a7df684b4836d11310421dd456363f383): One of the parameters is null.
- [ANDROID_IMAGE_DECODER_INVALID_INPUT](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034aa5369e0955007f52cd5d37d6dca891d1): There is an error in the header.
- [ANDROID_IMAGE_DECODER_SEEK_ERROR](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a6d697e48474b9af2a0dabb82a18ff698): The asset failed to seek.
- [ANDROID_IMAGE_DECODER_INTERNAL_ERROR](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a7a552d3a63135ac06d0437b2c66a8f1e): Some other error, like a failure to allocate memory.
- [ANDROID_IMAGE_DECODER_UNSUPPORTED_FORMAT](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a58bbc3ecdc072989e970449fa90fb938): The format is not supported.

<br />

Details Parameters `asset` [AAsset](https://developer.android.com/ndk/reference/group/asset#group___asset_1ga5630b1f1aa5cd363303018cb2f12f95c) containing encoded image data. Client is still responsible for calling [AAsset_close](https://developer.android.com/ndk/reference/group/asset#group___asset_1ga1f241e49f691dafcada23bcb76155122) on it, which may be done after deleting the returned [AImageDecoder](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149). `outDecoder` On success (i.e. return value is [ANDROID_IMAGE_DECODER_SUCCESS](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a0ec2d288909a072d3a6d0d82d20cc3bc)), this will be set to a newly created [AImageDecoder](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149). Caller is responsible for calling [AImageDecoder_delete](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga682bf61cf79b1946a790f709339815a6) on it. **Returns** [ANDROID_IMAGE_DECODER_SUCCESS](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a0ec2d288909a072d3a6d0d82d20cc3bc) on success or a value indicating the reason for the failure.

### AImageDecoder_createFromBuffer

Declared in `android/imagedecoder.h`

```
int AImageDecoder_createFromBuffer(
  const void *_Nonnull buffer,
  size_t length,
  AImageDecoder *_Nullable *_Nonnull outDecoder
)
```
Create a new AImageDecoder from a buffer.

Available since API level 30.


Errors:

- [ANDROID_IMAGE_DECODER_INCOMPLETE](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a988522e05099ed82618dc19c84d8686f): The encoded image was truncated before reading the image header.
- [ANDROID_IMAGE_DECODER_BAD_PARAMETER](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a7df684b4836d11310421dd456363f383): One of the parameters is invalid.
- [ANDROID_IMAGE_DECODER_INVALID_INPUT](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034aa5369e0955007f52cd5d37d6dca891d1): There is an error in the header.
- [ANDROID_IMAGE_DECODER_INTERNAL_ERROR](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a7a552d3a63135ac06d0437b2c66a8f1e): Some other error, like a failure to allocate memory.
- [ANDROID_IMAGE_DECODER_UNSUPPORTED_FORMAT](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a58bbc3ecdc072989e970449fa90fb938): The format is not supported.

<br />

Details Parameters `buffer` Pointer to encoded data. Must be valid for the entire time the [AImageDecoder](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149) is used. `length` Byte length of buffer. `outDecoder` On success (i.e. return value is [ANDROID_IMAGE_DECODER_SUCCESS](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a0ec2d288909a072d3a6d0d82d20cc3bc)), this will be set to a newly created [AImageDecoder](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149). Caller is responsible for calling [AImageDecoder_delete](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga682bf61cf79b1946a790f709339815a6) on it. **Returns** [ANDROID_IMAGE_DECODER_SUCCESS](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a0ec2d288909a072d3a6d0d82d20cc3bc) on success or a value indicating the reason for the failure.

### AImageDecoder_createFromFd

Declared in `android/imagedecoder.h`

```
int AImageDecoder_createFromFd(
  int fd,
  AImageDecoder *_Nullable *_Nonnull outDecoder
)
```
Create a new [AImageDecoder](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149) from a file descriptor.

Available since API level 30.


Errors:

- [ANDROID_IMAGE_DECODER_INCOMPLETE](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a988522e05099ed82618dc19c84d8686f): The file was truncated before reading the image header.
- [ANDROID_IMAGE_DECODER_BAD_PARAMETER](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a7df684b4836d11310421dd456363f383): The [AImageDecoder](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149) is null, or \|fd\| does not represent a valid, seekable file descriptor.
- [ANDROID_IMAGE_DECODER_INVALID_INPUT](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034aa5369e0955007f52cd5d37d6dca891d1): There is an error in the header.
- [ANDROID_IMAGE_DECODER_SEEK_ERROR](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a6d697e48474b9af2a0dabb82a18ff698): The descriptor failed to seek.
- [ANDROID_IMAGE_DECODER_INTERNAL_ERROR](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a7a552d3a63135ac06d0437b2c66a8f1e): Some other error, like a failure to allocate memory.
- [ANDROID_IMAGE_DECODER_UNSUPPORTED_FORMAT](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a58bbc3ecdc072989e970449fa90fb938): The format is not supported.

<br />

Details Parameters `fd` Seekable, readable, open file descriptor for encoded data. Client is still responsible for closing it, which may be done after deleting the returned [AImageDecoder](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149). `outDecoder` On success (i.e. return value is [ANDROID_IMAGE_DECODER_SUCCESS](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a0ec2d288909a072d3a6d0d82d20cc3bc)), this will be set to a newly created [AImageDecoder](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149). Caller is responsible for calling [AImageDecoder_delete](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga682bf61cf79b1946a790f709339815a6) on it. **Returns** [ANDROID_IMAGE_DECODER_SUCCESS](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a0ec2d288909a072d3a6d0d82d20cc3bc) on success or a value indicating the reason for the failure.

### AImageDecoder_decodeImage

Declared in `android/imagedecoder.h`

```
int AImageDecoder_decodeImage(
  AImageDecoder *_Nonnull decoder,
  void *_Nonnull pixels,
  size_t stride,
  size_t size
)
```
Decode the image into pixels, using the settings of the [AImageDecoder](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149).

Available since API level 30.

Starting in API level 31, it can be used to decode all of the frames of an animated image (i.e. GIF, WebP) using new APIs. Internally, AImageDecoder keeps track of its "current frame" - that is, the frame that will be decoded by a call to AImageDecoder_decodeImage. At creation time, the current frame is always the first frame, and multiple calls to this method will each decode the first frame. [AImageDecoder_advanceFrame](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga1910429b53cf1ec1eca588ad9cee354f) advances the current frame to the following frame, so that future calls to this method will decode that frame. Some frames may update only part of the image. They may only update a sub-rectangle (see [AImageDecoderFrameInfo_getFrameRect](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gaa5b881fcb6433bf2041a41f8def49f44)), or they may have alpha (see [AImageDecoderFrameInfo_hasAlphaWithinBounds](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gacdf8903fa408c55e3d9c2285a02035d6)). In these cases, this method assumes that the prior frame is still residing in the \|pixels\| buffer, decodes only the new portion, and blends it with the buffer. Frames that change the entire \|pixels\| buffer are "independent", and do not require the prior frame to remain in the buffer. The first frame is always independent. A sophisticated client can use information from the [AImageDecoderFrameInfo](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gae32203111ad776eaca2a30a88343711b) to determine whether other frames are independent, or what frames they rely on.

If the current frame is marked [ANDROID_IMAGE_DECODER_DISPOSE_OP_PREVIOUS](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gga0944a4353780132eeab7b06e3e42291dab6f94b11c70ce372ff8139542b952c0b), AImageDecoder_decodeImage will store the \|pixels\| buffer prior to decoding (note: this only happens for the first in a string of consecutive ANDROID_IMAGE_DECODER_DISPOSE_OP_PREVIOUS frames). After advancing to the following frame, AImageDecoder_decodeImage will restore that buffer prior to decoding that frame. This is the default behavior, but it can be disabled by passing false to [AImageDecoder_setInternallyHandleDisposePrevious](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga6afda5e1bf6f91836d805389c2c12ce3).

Ignoring timing information, display, etc, a client wishing to decode all frames of an animated image may conceptually use code like the following:

while (true) { int result = AImageDecoder_decodeImage(decoder, pixels, stride, size); if (result != ANDROID_IMAGE_DECODER_SUCCESS) break;

// Display or save the image in \|pixels\|, keeping the buffer intact for // AImageDecoder to decode the next frame correctly. Application_viewImage(pixels);

result = AImageDecoder_advanceFrame(decoder); if (result != ANDROID_IMAGE_DECODER_SUCCESS) break; }


Errors:

- [ANDROID_IMAGE_DECODER_INCOMPLETE](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a988522e05099ed82618dc19c84d8686f): The image was truncated. A partial image was decoded, and undecoded lines have been initialized to all zeroes.
- [ANDROID_IMAGE_DECODER_ERROR](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034aef2336a9ed6ba81489ead4b14d45d03d): The image contained an error. A partial image was decoded, and undecoded lines have been initialized to all zeroes.
- [ANDROID_IMAGE_DECODER_BAD_PARAMETER](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a7df684b4836d11310421dd456363f383): The [AImageDecoder](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149) or \|pixels\| is null, the stride is not large enough or not pixel aligned, or \|size\| is not large enough.
- [ANDROID_IMAGE_DECODER_SEEK_ERROR](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a6d697e48474b9af2a0dabb82a18ff698): The asset or file descriptor failed to seek.
- [ANDROID_IMAGE_DECODER_INTERNAL_ERROR](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a7a552d3a63135ac06d0437b2c66a8f1e): Some other error, like a failure to allocate memory.
- [ANDROID_IMAGE_DECODER_FINISHED](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a9e3a7e4e6016aa9237e99ab795245bad): The input contains no more frames. No decoding occurred. The client must call [AImageDecoder_rewind](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gaa89204e46d09c849d457eea8ea74e28c) before calling [AImageDecoder_decodeImage](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gaf281588607767ff1232c704c7f7d57ec) again.

<br />

Details Parameters `decoder` Opaque object representing the decoder. `pixels` On success, will be filled with the result of the decode. Must be large enough to hold \|size\| bytes. `stride` Width in bytes of a single row. Must be at least [AImageDecoder_getMinimumStride](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga19a382126186c0aebb46271b5852bb9d) and a multiple of the bytes per pixel of the [AndroidBitmapFormat](https://developer.android.com/ndk/reference/group/bitmap#group___bitmap_1gaea286a2d4c61ae2abb02b51500499f13). `size` Size of the pixel buffer in bytes. Must be at least stride \* (height - 1) + [AImageDecoder_getMinimumStride](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga19a382126186c0aebb46271b5852bb9d). **Returns** [ANDROID_IMAGE_DECODER_SUCCESS](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a0ec2d288909a072d3a6d0d82d20cc3bc) on success or a value indicating the reason for the failure.

### AImageDecoder_delete

Declared in `android/imagedecoder.h`

```
void AImageDecoder_delete(
  AImageDecoder *_Nullable decoder
)
```
Delete the AImageDecoder.

<br />

Details Parameters `decoder` [AImageDecoder](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149) object created with one of AImageDecoder_createFrom... functions. Available since API level 30.

### AImageDecoder_getFrameInfo

Declared in `android/imagedecoder.h`

```
int AImageDecoder_getFrameInfo(
  AImageDecoder *_Nonnull decoder,
  AImageDecoderFrameInfo *_Nonnull info
)
```
Fill \|info\| with information about the current frame.

Introduced in API 31.

Initially, this will return information about the first frame. [AImageDecoder_advanceFrame](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga1910429b53cf1ec1eca588ad9cee354f) and [AImageDecoder_rewind](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gaa89204e46d09c849d457eea8ea74e28c) can be used to change which frame is the current frame.

If the image only has one frame, this will fill the [AImageDecoderFrameInfo](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gae32203111ad776eaca2a30a88343711b) with the encoded info and reasonable defaults.

If [AImageDecoder_advanceFrame](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga1910429b53cf1ec1eca588ad9cee354f) succeeded, this will succeed as well.


Errors:

- [ANDROID_IMAGE_DECODER_BAD_PARAMETER](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a7df684b4836d11310421dd456363f383): One of the parameters is null.
- [ANDROID_IMAGE_DECODER_FINISHED](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a9e3a7e4e6016aa9237e99ab795245bad): The input contains no more frames. The client must call [AImageDecoder_rewind](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gaa89204e46d09c849d457eea8ea74e28c) to reset the current frame to a valid frame (0).

<br />

Details Parameters `decoder` Opaque object representing the decoder. `info` Opaque object to hold frame information. On success, will be filled with information regarding the current frame. **Returns** [ANDROID_IMAGE_DECODER_SUCCESS](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a0ec2d288909a072d3a6d0d82d20cc3bc) on success or a value indicating the reason for the failure.

### AImageDecoder_getHeaderInfo

Declared in `android/imagedecoder.h`

```
const AImageDecoderHeaderInfo *_Nonnull AImageDecoder_getHeaderInfo(
  const AImageDecoder *_Nonnull decoder
)
```
Return an opaque handle for reading header info.

This is owned by the [AImageDecoder](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149) and will be destroyed when the AImageDecoder is destroyed via [AImageDecoder_delete](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga682bf61cf79b1946a790f709339815a6).


Available since API level 30.
Details Parameters `decoder` an [AImageDecoder](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149) object.

### AImageDecoder_getMinimumStride

Declared in `android/imagedecoder.h`

```
size_t AImageDecoder_getMinimumStride(
  AImageDecoder *_Nonnull decoder
)
```
Return the minimum stride that can be used in [AImageDecoder_decodeImage](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gaf281588607767ff1232c704c7f7d57ec).

This stride provides no padding, meaning it will be exactly equal to the width times the number of bytes per pixel for the [AndroidBitmapFormat](https://developer.android.com/ndk/reference/group/bitmap#group___bitmap_1gaea286a2d4c61ae2abb02b51500499f13) being used.

If the output is scaled (via [AImageDecoder_setTargetSize](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga6b3a3e63ae5544416511357b5a1db0c3)) and/or cropped (via [AImageDecoder_setCrop](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga1adf67d55755c99752ba9ea08227533e)), this takes those into account.


Available since API level 30.
Details Parameters `decoder` an [AImageDecoder](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149) object.

### AImageDecoder_getRepeatCount

Declared in `android/imagedecoder.h`

```
int32_t AImageDecoder_getRepeatCount(
  AImageDecoder *_Nonnull decoder
)
```
Report how many times the animation should repeat.

Introduced in API 31.

This does not include the first play through. e.g. a repeat count of 4 means that each frame is played 5 times.

[ANDROID_IMAGE_DECODER_INFINITE](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gga0ed680fdb405e7195d9f14032851eebba053f59787fb53a29ddca96532f2bdc5e) means to repeat forever.

This may require seeking.

For non-animated formats, this returns 0. It may return non-zero for an image with only one frame (i.e. [AImageDecoder_isAnimated](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga1aa5cb1fc59567844ebcf7239e47b52d) returns false) if the encoded image contains a repeat count.


Errors:

- [ANDROID_IMAGE_DECODER_BAD_PARAMETER](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a7df684b4836d11310421dd456363f383): The AImageDecoder is null.

<br />

Details Parameters `decoder` an [AImageDecoder](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149) object. **Returns** Number of times to repeat on success or a value indicating the reason for the failure.

### AImageDecoder_isAnimated

Declared in `android/imagedecoder.h`

```
bool AImageDecoder_isAnimated(
  AImageDecoder *_Nonnull decoder
)
```
Return true iff the image is animated - i.e.

has multiple frames.

Introduced in API 31.

A single frame GIF is considered to *not* be animated. This may require seeking past the first frame to verify whether there is a following frame.


Errors:

- returns false if \|decoder\| is null.

<br />

Details Parameters `decoder` an [AImageDecoder](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149) object.

### AImageDecoder_resultToString

Declared in `android/imagedecoder.h`

```
const char *_Nullable AImageDecoder_resultToString(
  int
)
```
Return a constant string value representing the error code.

Introduced in API 31.

Pass the return value from an [AImageDecoder](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149) method (e.g. [AImageDecoder_decodeImage](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gaf281588607767ff1232c704c7f7d57ec)) for a text string representing the error code.

Errors:

- Returns null for a value out of range.

<br />

### AImageDecoder_rewind

Declared in `android/imagedecoder.h`

```
int AImageDecoder_rewind(
  AImageDecoder *_Nonnull decoder
)
```
Return to the beginning of the animation.

Introduced in API 31.

After this call, the AImageDecoder will be ready to decode the first frame of the animation. This can be called after reaching the end of the animation or an error or in the middle of the animation.


Errors:

- [ANDROID_IMAGE_DECODER_BAD_PARAMETER](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a7df684b4836d11310421dd456363f383): The AImageDecoder represents an image that is not animated (see [AImageDecoder_isAnimated](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga1aa5cb1fc59567844ebcf7239e47b52d)) or the AImageDecoder is null.
- [ANDROID_IMAGE_DECODER_SEEK_ERROR](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a6d697e48474b9af2a0dabb82a18ff698): The asset or file descriptor failed to seek.

<br />

Details Parameters `decoder` an [AImageDecoder](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149) object. **Returns** [ANDROID_IMAGE_DECODER_SUCCESS](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a0ec2d288909a072d3a6d0d82d20cc3bc) on success or a value indicating the reason for the failure.

### AImageDecoder_setAndroidBitmapFormat

Declared in `android/imagedecoder.h`

```
int AImageDecoder_setAndroidBitmapFormat(
  AImageDecoder *_Nonnull decoder,
  int32_t format
)
```
Choose the desired output format.

If the encoded image represents an animation, this must be called while on the first frame (e.g. before calling [AImageDecoder_advanceFrame](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga1910429b53cf1ec1eca588ad9cee354f) or after calling [AImageDecoder_rewind](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gaa89204e46d09c849d457eea8ea74e28c)).

Available since API level 30.


Errors:

- [ANDROID_IMAGE_DECODER_BAD_PARAMETER](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a7df684b4836d11310421dd456363f383): The [AImageDecoder](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149) is null or \|format\| does not correspond to an [AndroidBitmapFormat](https://developer.android.com/ndk/reference/group/bitmap#group___bitmap_1gaea286a2d4c61ae2abb02b51500499f13).
- [ANDROID_IMAGE_DECODER_INVALID_CONVERSION](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a01038add3845072fc6a3e7dc66d38cec): The [AndroidBitmapFormat](https://developer.android.com/ndk/reference/group/bitmap#group___bitmap_1gaea286a2d4c61ae2abb02b51500499f13) is incompatible with the image.
- [ANDROID_IMAGE_DECODER_INVALID_STATE](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a0e1f2b528e0ba161075182fda7dbcf8e): The animation is not on the first frame.

<br />

Details Parameters `format` [AndroidBitmapFormat](https://developer.android.com/ndk/reference/group/bitmap#group___bitmap_1gaea286a2d4c61ae2abb02b51500499f13) to use for the output. `decoder` an [AImageDecoder](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149) object. **Returns** [ANDROID_IMAGE_DECODER_SUCCESS](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a0ec2d288909a072d3a6d0d82d20cc3bc) on success or a value indicating the reason for the failure. On failure, the [AImageDecoder](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149) uses the format it was already planning to use (either its default or a previously successful setting from this function).

### AImageDecoder_setCrop

Declared in `android/imagedecoder.h`

```
int AImageDecoder_setCrop(
  AImageDecoder *_Nonnull decoder,
  ARect crop
)
```
Specify how to crop the output after scaling (if any).

Future calls to [AImageDecoder_decodeImage](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gaf281588607767ff1232c704c7f7d57ec) will crop their output to the specified [ARect](https://developer.android.com/ndk/reference/struct/a-rect#struct_a_rect). Clients will only need to allocate enough memory for the cropped [ARect](https://developer.android.com/ndk/reference/struct/a-rect#struct_a_rect).

If the encoded image represents an animation, this must be called while on the first frame (e.g. before calling [AImageDecoder_advanceFrame](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga1910429b53cf1ec1eca588ad9cee354f) or after calling [AImageDecoder_rewind](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gaa89204e46d09c849d457eea8ea74e28c)).

Available since API level 30.


Errors:

- [ANDROID_IMAGE_DECODER_BAD_PARAMETER](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a7df684b4836d11310421dd456363f383): The [AImageDecoder](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149) is null, or the crop is not contained by the (possibly scaled) image dimensions.
- [ANDROID_IMAGE_DECODER_INVALID_STATE](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a0e1f2b528e0ba161075182fda7dbcf8e): The animation is not on the first frame.

<br />

Details Parameters `decoder` an [AImageDecoder](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149) object. `crop` Rectangle describing a crop of the decode. It must be contained inside of the (possibly scaled, by [AImageDecoder_setTargetSize](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga6b3a3e63ae5544416511357b5a1db0c3)) image dimensions. This will affect future calls to [AImageDecoder_getMinimumStride](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga19a382126186c0aebb46271b5852bb9d), which will now return a value based on the width of the crop. An empty [ARect](https://developer.android.com/ndk/reference/struct/a-rect#struct_a_rect) - specifically { 0, 0, 0, 0 } - may be used to remove the cropping behavior. Any other empty or unsorted ARects will result in returning [ANDROID_IMAGE_DECODER_BAD_PARAMETER](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a7df684b4836d11310421dd456363f383). **Returns** [ANDROID_IMAGE_DECODER_SUCCESS](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a0ec2d288909a072d3a6d0d82d20cc3bc) on success or a value indicating the reason for the failure.

### AImageDecoder_setDataSpace

Declared in `android/imagedecoder.h`

```
int AImageDecoder_setDataSpace(
  AImageDecoder *_Nonnull decoder,
  int32_t dataspace
)
```
Choose the dataspace for the output.

Ignored by [ANDROID_BITMAP_FORMAT_A_8](https://developer.android.com/ndk/reference/group/bitmap#group___bitmap_1ggaea286a2d4c61ae2abb02b51500499f13ad29996be25f8f88c96e016a1da5c4bca), which does not support an [ADataSpace](https://developer.android.com/ndk/reference/group/a-data-space#group___a_data_space).

If the encoded image represents an animation, this must be called while on the first frame (e.g. before calling [AImageDecoder_advanceFrame](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga1910429b53cf1ec1eca588ad9cee354f) or after calling [AImageDecoder_rewind](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gaa89204e46d09c849d457eea8ea74e28c)).

Available since API level 30.


Errors:

- [ANDROID_IMAGE_DECODER_BAD_PARAMETER](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a7df684b4836d11310421dd456363f383): The [AImageDecoder](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149) is null or \|dataspace\| does not correspond to an [ADataSpace](https://developer.android.com/ndk/reference/group/a-data-space#group___a_data_space) value.
- [ANDROID_IMAGE_DECODER_INVALID_STATE](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a0e1f2b528e0ba161075182fda7dbcf8e): The animation is not on the first frame.

<br />

Details Parameters `decoder` an [AImageDecoder](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149) object. `dataspace` The [ADataSpace](https://developer.android.com/ndk/reference/group/a-data-space#group___a_data_space) to decode into. An ADataSpace specifies how to interpret the colors. By default, AImageDecoder will decode into the ADataSpace specified by [AImageDecoderHeaderInfo_getDataSpace](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga51c830b3051a670e7ed3fd78574d3dd5). If this parameter is set to a different ADataSpace, AImageDecoder will transform the output into the specified ADataSpace. **Returns** [ANDROID_IMAGE_DECODER_SUCCESS](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a0ec2d288909a072d3a6d0d82d20cc3bc) on success or a value indicating the reason for the failure.

### AImageDecoder_setInternallyHandleDisposePrevious

Declared in `android/imagedecoder.h`

```
void AImageDecoder_setInternallyHandleDisposePrevious(
  AImageDecoder *_Nonnull decoder,
  bool handleInternally
)
```
Whether to have AImageDecoder store the frame prior to a frame marked [ANDROID_IMAGE_DECODER_DISPOSE_OP_PREVIOUS](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gga0944a4353780132eeab7b06e3e42291dab6f94b11c70ce372ff8139542b952c0b).

Introduced in API 31.

The default is true. Many images will not have such a frame (it is not supported by WebP, and only some GIFs use it). But if frame i is ANDROID_IMAGE_DECODER_DISPOSE_OP_PREVIOUS, then i+1 may depend on i-1. When this setting is true, AImageDecoder will defensively copy frame i-1 (i.e. the contents of \|pixels\| in [AImageDecoder_decodeImage](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gaf281588607767ff1232c704c7f7d57ec)) into an internal buffer so that it can be used to decode i+1.

AImageDecoder will only store a single frame, at the size specified by [AImageDecoder_setTargetSize](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga6b3a3e63ae5544416511357b5a1db0c3) (or the original dimensions if that method has not been called), and will discard it when it is no longer necessary.

A client that desires to manually store such frames may set this to false, so that AImageDecoder does not need to store this extra frame. Instead, when decoding the same ANDROID_IMAGE_DECODER_DISPOSE_OP_PREVIOUS frame i, AImageDecoder will decode directly into \|pixels\|, assuming the client stored i-1. When asked to decode frame i+1, AImageDecoder will now assume that the client provided i-1 in \|pixels\|.

<br />

Details Parameters `decoder` an [AImageDecoder](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149) object. `handleInternally` Whether AImageDecoder will internally handle ANDROID_IMAGE_DECODER_DISPOSE_OP_PREVIOUS frames.

### AImageDecoder_setTargetSize

Declared in `android/imagedecoder.h`

```
int AImageDecoder_setTargetSize(
  AImageDecoder *_Nonnull decoder,
  int32_t width,
  int32_t height
)
```
Specify the output size for a decoded image.

Future calls to [AImageDecoder_decodeImage](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gaf281588607767ff1232c704c7f7d57ec) will sample or scale the encoded image to reach the desired size. If a crop rect is set (via [AImageDecoder_setCrop](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga1adf67d55755c99752ba9ea08227533e)), it must be contained within the dimensions specified by width and height, and the output image will be the size of the crop rect.

If the encoded image represents an animation, this must be called while on the first frame (e.g. before calling [AImageDecoder_advanceFrame](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga1910429b53cf1ec1eca588ad9cee354f) or after calling [AImageDecoder_rewind](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gaa89204e46d09c849d457eea8ea74e28c)).

It is strongly recommended to use setTargetSize only for downscaling, as it is often more efficient to scale-up when rendering than up-front due to reduced overall memory.

Available since API level 30.


Errors:

- [ANDROID_IMAGE_DECODER_BAD_PARAMETER](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a7df684b4836d11310421dd456363f383): The [AImageDecoder](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149) is null.
- [ANDROID_IMAGE_DECODER_INVALID_SCALE](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034ad1f8effc2dc250a7ed2547232eea38d8): \|width\| or \|height\| is \<= 0, the size is too big, any existing crop is not contained by the new image dimensions, or the scale is incompatible with a previous call to [AImageDecoder_setUnpremultipliedRequired](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gaa08fb75e5e7b906e12cfa94d4b745a34)(true).
- [ANDROID_IMAGE_DECODER_INVALID_STATE](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a0e1f2b528e0ba161075182fda7dbcf8e): The animation is not on the first frame.

<br />

Details Parameters `decoder` an [AImageDecoder](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149) object. `width` Width of the output (prior to cropping). This will affect future calls to [AImageDecoder_getMinimumStride](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga19a382126186c0aebb46271b5852bb9d), which will now return a value based on this width. `height` Height of the output (prior to cropping). **Returns** [ANDROID_IMAGE_DECODER_SUCCESS](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a0ec2d288909a072d3a6d0d82d20cc3bc) on success or a value indicating the reason for the failure.

### AImageDecoder_setUnpremultipliedRequired

Declared in `android/imagedecoder.h`

```
int AImageDecoder_setUnpremultipliedRequired(
  AImageDecoder *_Nonnull decoder,
  bool unpremultipliedRequired
)
```
Specify whether the output's pixels should be unpremultiplied.

By default, [AImageDecoder_decodeImage](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gaf281588607767ff1232c704c7f7d57ec) will premultiply the pixels, if they have alpha. Pass true to this method to leave them unpremultiplied. This has no effect on an opaque image.

If the encoded image represents an animation, this must be called while on the first frame (e.g. before calling [AImageDecoder_advanceFrame](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga1910429b53cf1ec1eca588ad9cee354f) or after calling [AImageDecoder_rewind](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1gaa89204e46d09c849d457eea8ea74e28c)).

Available since API level 30.


Errors:

- [ANDROID_IMAGE_DECODER_INVALID_CONVERSION](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a01038add3845072fc6a3e7dc66d38cec): Unpremultiplied is not possible due to an existing scale set by [AImageDecoder_setTargetSize](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga6b3a3e63ae5544416511357b5a1db0c3).
- [ANDROID_IMAGE_DECODER_BAD_PARAMETER](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a7df684b4836d11310421dd456363f383): The [AImageDecoder](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149) is null.
- [ANDROID_IMAGE_DECODER_INVALID_STATE](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a0e1f2b528e0ba161075182fda7dbcf8e): The animation is not on the first frame.

<br />

Details Parameters `decoder` an [AImageDecoder](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ga89b4e91be8886a2bf9ccd87b620b6149) object. `unpremultipliedRequired` Pass true to leave the pixels unpremultiplied. **Returns** [ANDROID_IMAGE_DECODER_SUCCESS](https://developer.android.com/ndk/reference/group/image-decoder#group___image_decoder_1ggaac34dfe6c6b73b43a4656c9dce041034a0ec2d288909a072d3a6d0d82d20cc3bc) on success or a value indicating the reason for the failure.