Interfejs API NDK ImageDecoder udostępnia standardowy interfejs API dla aplikacji na Androida w języku C/C++ do bezpośredniego dekodowania obrazów. Deweloperzy aplikacji nie muszą już używać interfejsów API Javy (przez JNI) ani bibliotek dekodowania obrazów innych firm. Ten interfejs API wraz z funkcjami kodowania w module Bitmap umożliwia:
- Aplikacje i biblioteki natywne mogą być mniejsze, ponieważ nie muszą już zawierać własnych bibliotek dekodowania.
- Aplikacje i biblioteki automatycznie korzystają z aktualizacji zabezpieczeń platformy dotyczących bibliotek dekodowania.
- Aplikacje mogą dekodować obrazy bezpośrednio do udostępnionej pamięci. Aplikacje mogą następnie przetworzyć dane obrazu (jeśli jest to konieczne) i przekazać je do OpenGL lub kodu rysowania.
Na tej stronie dowiesz się, jak używać interfejsu API do dekodowania obrazu.
Dostępność i możliwości
Interfejs API ImageDecoder jest dostępny w aplikacjach kierowanych na Androida 11 (API na poziomie 30) lub nowszego. Implementacja znajduje się w tych plikach:
imagedecoder.hdla dekoderabitmap.hdla koderalibjnigraphics.so
Interfejs API obsługuje następujące formaty plików graficznych:
- JPEG,
- PNG
- GIF
- WebP
BMP
ICO
WBMP
HEIF
Digital Negatives (za pomocą pakietu SDK DNG)
Aby uwzględnić wszystkie zastosowania zdekodowanych nieprzetworzonych obrazów, ten interfejs API nie udostępnia obiektów wyższego poziomu, takich jak te utworzone na podstawie zdekodowanych obrazów w ramach platformy Java, np.:
- Obiekty:
Drawable. NinePatch: jeśli we fragmencie zakodowanego obrazu występują fragmenty NinePatch, są one ignorowane.- Gęstość bitmapy:
AImageDecodernie dostosowuje automatycznie rozmiaru na podstawie gęstości ekranu, ale umożliwia dekodowanie do innego rozmiaru za pomocąAImageDecoder_setTargetSize(). - Animacje: dekoduje tylko pierwszą klatkę animowanego pliku GIF lub WebP.
Dekodowanie obrazu
Dekodowanie rozpoczyna się od danych wejściowych reprezentujących zakodowany obraz.
AImageDecoder akceptuje różne typy danych wejściowych:
AAsset(jak poniżej)- Deskryptor pliku
- Bufor
Poniższy kod pokazuje, jak otworzyć obraz Asset z pliku, zdekodować go, a następnie prawidłowo usunąć dekoder i zasób. Przykład renderowania zdekodowanego obrazu znajdziesz w przykładzie z czajnikiem.
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);