Decodificador de imagem
Mantenha tudo organizado com as coleções
Salve e categorize o conteúdo com base nas suas preferências.
A API NDK ImageDecoder
fornece uma API padrão para apps Android C/C ++ para decodificar imagens diretamente. Os desenvolvedores de aplicativos não precisam mais usar as APIs Java (via JNI) ou bibliotecas de decodificação de imagens de terceiros. Essa API, com as funções de codificação do módulo Bitmap, permite o seguinte:
- Os aplicativos e bibliotecas nativos podem ser menores porque não precisam mais vincular as próprias bibliotecas de decodificação.
- Aplicativos e bibliotecas são automaticamente beneficiados pelas atualizações de segurança da plataforma para bibliotecas de decodificação.
- Os aplicativos podem decodificar imagens diretamente na memória que fornecem. Em seguida, os apps podem pós-processar os dados da imagem e enviá-los para o OpenGL ou para o código de desenho.
Esta página descreve como usar a API para decodificar uma imagem.
Disponibilidade e capacidade
A API ImageDecoder
está disponível em apps direcionados ao Android 11 (API de nível 30)
ou versões mais recentes. A implementação está dentro dos seguintes arquivos:
imagedecoder.h
para o decodificador
bitmap.h
para o codificador
libjnigraphics.so
A API é compatível com os seguintes formatos de imagem:
Para abranger todos os usos das imagens brutas decodificadas, essa API não
fornece objetos de nível superior, por exemplo, aqueles criados sobre imagens decodificadas dentro
do framework Java, como:
- objetos
Drawable
;
NinePatch
: se presente em uma
imagem codificada, os blocos NinePatch serão ignorados;
- densidade de bitmap:
AImageDecoder
não faz nenhuma modificação automática de tamanho com base na
densidade da tela, mas permite a decodificação para um tamanho diferente por
AImageDecoder_setTargetSize()
;
- Animações: decodifica apenas o primeiro frame de um arquivo GIF ou WebP animado.
Decodificar uma imagem
A decodificação começa com alguma forma de entrada que representa a imagem codificada.
AImageDecoder
aceita vários tipos de entrada:
AAsset
(mostrado abaixo)
- Descritor do arquivo
- Buffer
O código a seguir mostra como abrir uma imagem Asset
de um arquivo, decodificá-la
e descartar corretamente o decodificador e o recurso. Para ver um exemplo de renderização da imagem decodificada, consulte a amostra Teapot (link em inglês).
AAssetManager* nativeManager = AAssetManager_fromJava(env, jAssets);
const char* file = // Filename
AAsset* asset = AAssetManager_open(nativeManager, file, AASSET_MODE_STREAMING);
AImageDecoder* decoder;
int result = AImageDecoder_createFromAAsset(asset, &decoder);
if (result != ANDROID_IMAGE_DECODER_SUCCESS) {
// An error occurred, and the file could not be decoded.
}
const AImageDecoderHeaderInfo* info = AImageDecoder_getHeaderInfo(decoder);
int32_t width = AImageDecoderHeaderInfo_getWidth(info);
int32_t height = AImageDecoderHeaderInfo_getHeight(info);
AndroidBitmapFormat format =
(AndroidBitmapFormat) AImageDecoderHeaderInfo_getAndroidBitmapFormat(info);
size_t stride = AImageDecoder_getMinimumStride(decoder); // Image decoder does not
// use padding by default
size_t size = height * stride;
void* pixels = malloc(size);
result = AImageDecoder_decodeImage(decoder, pixels, stride, size);
if (result != ANDROID_IMAGE_DECODER_SUCCESS) {
// An error occurred, and the file could not be decoded.
}
// We’re done with the decoder, so now it’s safe to delete it.
AImageDecoder_delete(decoder);
// The decoder is no longer accessing the AAsset, so it is safe to
// close it.
AAsset_close(asset);
// Draw the pixels somewhere
// Free the pixels when done drawing with them
free(pixels);
O conteúdo e os exemplos de código nesta página estão sujeitos às licenças descritas na Licença de conteúdo. Java e OpenJDK são marcas registradas da Oracle e/ou suas afiliadas.
Última atualização 2025-08-27 UTC.
[[["Fácil de entender","easyToUnderstand","thumb-up"],["Meu problema foi resolvido","solvedMyProblem","thumb-up"],["Outro","otherUp","thumb-up"]],[["Não contém as informações de que eu preciso","missingTheInformationINeed","thumb-down"],["Muito complicado / etapas demais","tooComplicatedTooManySteps","thumb-down"],["Desatualizado","outOfDate","thumb-down"],["Problema na tradução","translationIssue","thumb-down"],["Problema com as amostras / o código","samplesCodeIssue","thumb-down"],["Outro","otherDown","thumb-down"]],["Última atualização 2025-08-27 UTC."],[],[],null,["The NDK [`ImageDecoder`](/ndk/reference/group/image-decoder) API provides a\nstandard API for Android C/C++ apps to decode images directly. App developers no\nlonger need to use the Java APIs (via JNI) or third-party image decoding\nlibraries. This API, along with encoding functions in the\n[Bitmap](/ndk/reference/group/bitmap) module, enables the following:\n\n- Native apps and libraries can be smaller because they no longer have to link their own decoding libraries.\n- Apps and libraries automatically benefit from platform security updates to decoding libraries.\n- Apps can decode images directly into memory they provide. Apps can then post-process the image data (if desired) and pass it to OpenGL or their drawing code.\n\nThis page describes how to use the API to decode an image.\n\nAvailability and capability\n\nThe `ImageDecoder` API is available on apps that target Android 11 (API level 30)\nor higher. The implementation is inside the following files:\n\n- `imagedecoder.h` for the decoder\n- `bitmap.h` for the encoder\n- `libjnigraphics.so`\n\nThe API supports the following image formats:\n\n- JPEG\n- PNG\n- GIF\n- WebP\n- BMP\n\n- ICO\n\n- WBMP\n\n- HEIF\n\n- Digital negatives (via the DNG SDK)\n\nIn order to cover all usages of the decoded raw images, this API does not\nprovide higher level objects like those built on top of decoded images inside\nthe Java framework, such as:\n\n- [`Drawable` objects](/reference/android/graphics/drawable/Drawable).\n- [`NinePatch`](/reference/android/graphics/NinePatch): If present in an encoded image, NinePatch chunks are ignored.\n- [Bitmap density](/reference/android/graphics/Bitmap#getDensity()): `AImageDecoder` does not do any automatic size adjustment based on the screen's density, but it does allow decoding to a different size via [`AImageDecoder_setTargetSize()`](/ndk/reference/group/image-decoder#aimagedecoder_settargetsize).\n- Animations: Only decodes the first frame of an animated GIF or WebP file.\n\nDecode an image\n\nDecoding starts with some form of input representing the encoded image.\n`AImageDecoder` accepts multiple types of input:\n\n- [`AAsset`](/ndk/reference/group/asset) (shown below)\n- File descriptor\n- Buffer\n\nThe following code shows how to open an image `Asset` from a file, decode it,\nand then properly dispose of the decoder and asset. To see an example of\nrendering the decoded image, see the\n[teapot sample](https://github.com/android/ndk-samples/tree/develop/teapots/image-decoder/src/main/cpp/Texture.cpp#30). \n\n AAssetManager* nativeManager = AAssetManager_fromJava(env, jAssets);\n const char* file = // Filename\n AAsset* asset = AAssetManager_open(nativeManager, file, AASSET_MODE_STREAMING);\n AImageDecoder* decoder;\n int result = AImageDecoder_createFromAAsset(asset, &decoder);\n if (result != ANDROID_IMAGE_DECODER_SUCCESS) {\n // An error occurred, and the file could not be decoded.\n }\n\n const AImageDecoderHeaderInfo* info = AImageDecoder_getHeaderInfo(decoder);\n int32_t width = AImageDecoderHeaderInfo_getWidth(info);\n int32_t height = AImageDecoderHeaderInfo_getHeight(info);\n AndroidBitmapFormat format =\n (AndroidBitmapFormat) AImageDecoderHeaderInfo_getAndroidBitmapFormat(info);\n size_t stride = AImageDecoder_getMinimumStride(decoder); // Image decoder does not\n // use padding by default\n size_t size = height * stride;\n void* pixels = malloc(size);\n\n result = AImageDecoder_decodeImage(decoder, pixels, stride, size);\n if (result != ANDROID_IMAGE_DECODER_SUCCESS) {\n // An error occurred, and the file could not be decoded.\n }\n\n // We're done with the decoder, so now it's safe to delete it.\n AImageDecoder_delete(decoder);\n\n // The decoder is no longer accessing the AAsset, so it is safe to\n // close it.\n AAsset_close(asset);\n\n // Draw the pixels somewhere\n\n // Free the pixels when done drawing with them\n free(pixels);"]]