NDK ImageDecoder API предоставляет стандартный API для приложений Android C/C++, позволяющий декодировать изображения напрямую. Разработчикам приложений больше не нужно использовать Java API (через JNI) или сторонние библиотеки декодирования изображений. Этот API вместе с функциями кодирования в модуле Bitmap позволяет:
- Нативные приложения и библиотеки могут быть меньше, поскольку им больше не нужно связывать собственные библиотеки декодирования.
- Приложения и библиотеки автоматически получают обновления системы безопасности платформы для библиотек декодирования.
- Приложения могут декодировать изображения непосредственно в предоставляемую ими память. Затем приложения могут выполнить постобработку данных изображения (при необходимости) и передать их в OpenGL или свой код рисования.
На этой странице описано, как использовать API для декодирования изображения.
Доступность и возможности
API ImageDecoder доступен в приложениях, предназначенных для Android 11 (уровень API 30) или более поздней версии. Реализация находится в следующих файлах:
imagedecoder.hдля декодераbitmap.hдля видеокодераlibjnigraphics.so
API поддерживает следующие графические форматы:
- JPEG
- PNG
- GIF
- WebP
BMP
ICO
WBMP
HEIF
Digital Negative (через DNG SDK)
Чтобы охватить все варианты использования декодированных необработанных изображений, этот API не предоставляет объекты более высокого уровня, например те, которые созданы на основе декодированных изображений в платформе Java, такие как:
Drawableобъектов.NinePatch. Если в закодированном изображении есть фрагменты NinePatch, они игнорируются.- Плотность битовой карты.
AImageDecoderне корректирует размер автоматически в зависимости от плотности экрана, но позволяет декодировать изображение в другой размер с помощьюAImageDecoder_setTargetSize(). - Анимации. Декодируется только первый кадр анимированного файла GIF или WebP.
Как расшифровать изображение
Декодирование начинается с ввода закодированного изображения.
AImageDecoder принимает несколько типов входных данных:
AAsset(см. ниже).- Дескриптор файла
- Буфер
В следующем коде показано, как открыть изображение Asset из файла, декодировать его, а затем правильно удалить декодер и объект. Пример рендеринга декодированного изображения можно найти в образце teapot.
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);