L'API NDK ImageDecoder
fornisce una
API standard per le app Android C/C++ per decodificare direttamente le immagini. No agli sviluppatori di app
non dovranno più utilizzare le API Java (tramite JNI) o la decodifica di immagini di terze parti
librerie. Questa API, insieme alle funzioni di codifica
Bitmap, abilita quanto segue:
- Le app e le librerie native possono avere dimensioni inferiori perché non devono più essere collegate le proprie librerie di decodifica.
- App e librerie traggono automaticamente vantaggio dagli aggiornamenti della sicurezza della piattaforma per di decodifica delle librerie.
- Le app possono decodificare le immagini direttamente nella memoria che forniscono. Le app possono quindi dopo aver elaborato i dati dell'immagine (se lo desideri) e passarli a OpenGL o codice di disegno.
In questa pagina viene descritto come utilizzare l'API per decodificare un'immagine.
Disponibilità e funzionalità
L'API ImageDecoder
è disponibile sulle app destinate ad Android 11 (livello API 30)
o superiore. L'implementazione è inclusa nei seguenti file:
imagedecoder.h
per il decoderbitmap.h
per l'encoderlibjnigraphics.so
L'API supporta i seguenti formati di immagine:
- JPEG
- PNG
- GIF
- WebP
BMP
ICO
WBMP
HEIF
Digital negative (tramite SDK DNG)
Per coprire tutti gli utilizzi delle immagini non elaborate decodificate, questa API non forniscono oggetti di livello superiore come quelli basati su immagini decodificate all'interno il framework Java, ad esempio:
Drawable
oggetti.NinePatch
: se presente in una dell'immagine codificata, i blocchi NinePatch vengono ignorati.- Densità bitmap:
AImageDecoder
non esegue alcuna regolazione automatica delle dimensioni in base al densità dello schermo, ma consente la decodifica a una dimensione diversaAImageDecoder_setTargetSize()
. - Animazioni: decodifica solo il primo frame di un file GIF animato o WebP.
Decodifica un'immagine
La decodifica inizia con una qualche forma di input che rappresenta l'immagine codificata.
AImageDecoder
accetta più tipi di input:
AAsset
(visualizzato di seguito)- Descrittore del file
- Buffer
Il seguente codice mostra come aprire un'immagine Asset
da un file, decodificarla,
e quindi smaltire correttamente il decoder e l'asset. Per un esempio di
eseguire il rendering dell'immagine decodificata, osserva
esempio di tessera.
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);