Die NDK ImageDecoder
API bietet eine
Standard-API für Android C/C++ Apps, um Bilder direkt zu decodieren. App-Entwickler – keine
müssen länger die Java-APIs (über JNI) oder die Bilddecodierung von Drittanbietern verwenden.
Bibliotheken. Dieses API zusammen mit Codierungsfunktionen in der
Bitmap-Modul zur Verfügung, um Folgendes zu ermöglichen:
- Native Apps und Bibliotheken können kleiner sein, da sie nicht mehr verknüpft werden müssen ihre eigenen Decodierungsbibliotheken.
- Apps und Bibliotheken profitieren automatisch von Plattform-Sicherheitsupdates, Decodierungsbibliotheken.
- Apps können Bilder direkt in den von ihnen bereitgestellten Speicher decodieren. Apps können dann Verarbeiten Sie die Bilddaten nach Bedarf (falls gewünscht) und übergeben Sie sie an OpenGL oder ihre Code zu zeichnen.
Auf dieser Seite wird beschrieben, wie Sie mit der API ein Bild decodieren können.
Verfügbarkeit und Funktion
Die ImageDecoder
API ist für Apps verfügbar, die auf Android 11 (API-Level 30) ausgerichtet sind
oder höher. Die Implementierung befindet sich in den folgenden Dateien:
imagedecoder.h
für den Decoderbitmap.h
für den Encoderlibjnigraphics.so
Die API unterstützt die folgenden Bildformate:
- JPEG
- PNG
- GIF
- WebP
BMP
ICO
WBMP
HEIFS
Digitale Negative (über das DNG SDK)
Um alle Verwendungen der decodierten Rohbilder abzudecken, enthält diese API keine übergeordnete Objekte bereitstellen, z. B. solche, die auf decodierten Bildern basieren des Java-Frameworks an. Beispiel:
Drawable
-Objekte.NinePatch
: Falls in einem codiertes Bild codiert, werden NinePatch-Blöcke ignoriert.- Bitmapdichte:
AImageDecoder
führt keine automatische Größenanpassung anhand des Bildschirmdichte, aber es ermöglicht die Decodierung in eine andere Größe überAImageDecoder_setTargetSize()
- Animationen: Decodiert nur den ersten Frame einer animierten GIF- oder WebP-Datei.
Bild decodieren
Die Decodierung beginnt mit einer Eingabe, die das codierte Bild darstellt.
AImageDecoder
akzeptiert mehrere Eingabetypen:
AAsset
(siehe unten)- Dateideskriptor
- Puffer
Der folgende Code zeigt, wie Sie ein Bild Asset
aus einer Datei öffnen, decodieren,
und dann den Decoder und das Asset ordnungsgemäß entsorgen. Ein Beispiel für eine
das decodierte Bild rendern, siehe
Teekanne.
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);