Dekoder obrazów
Zadbaj o dobrą organizację dzięki kolekcji
Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.
Interfejs NDK ImageDecoder
API udostępnia standardowy interfejs API dla aplikacji na Androida napisanych w C/C++, który umożliwia bezpośrednie dekodowanie obrazów. Deweloperzy aplikacji nie muszą już korzystać z interfejsów API Java (za pomocą 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ż łączyć własnych bibliotek dekodowania.
- Aplikacje i biblioteki automatycznie korzystają z aktualizacji zabezpieczeń platformy w bibliotekach dekodowania.
- Aplikacje mogą dekodować obrazy bezpośrednio w pamięci, którą udostępniają. Aplikacje mogą następnie przetwarzać dane obrazu (w razie potrzeby) i przekazywać je do OpenGL lub kodu rysowania.
Na tej stronie opisujemy, jak używać interfejsu API do dekodowania obrazu.
Dostępność i możliwości
Interfejs ImageDecoder
API jest dostępny w aplikacjach kierowanych na Androida 11 (poziom API 30) lub nowszego. Implementacja znajduje się w tych plikach:
imagedecoder.h
dla dekodera
bitmap.h
dla kodera
libjnigraphics.so
Interfejs API obsługuje te formaty obrazów:
Aby uwzględnić wszystkie zastosowania zdekodowanych obrazów w formacie RAW, ten interfejs API nie udostępnia obiektów wyższego poziomu, takich jak te, które są tworzone na podstawie zdekodowanych obrazów w ramach platformy Java, np.:
Drawable
obiektów.
NinePatch
: Jeśli w zakodowanym obrazie występują fragmenty NinePatch, są one ignorowane.
- Gęstość bitmapy:
AImageDecoder
nie 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 wiele typów 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);
Treść strony i umieszczone na niej fragmenty kodu podlegają licencjom opisanym w Licencji na treści. Java i OpenJDK są znakami towarowymi lub zastrzeżonymi znakami towarowymi należącymi do firmy Oracle lub jej podmiotów stowarzyszonych.
Ostatnia aktualizacja: 2025-08-27 UTC.
[[["Łatwo zrozumieć","easyToUnderstand","thumb-up"],["Rozwiązało to mój problem","solvedMyProblem","thumb-up"],["Inne","otherUp","thumb-up"]],[["Brak potrzebnych mi informacji","missingTheInformationINeed","thumb-down"],["Zbyt skomplikowane / zbyt wiele czynności do wykonania","tooComplicatedTooManySteps","thumb-down"],["Nieaktualne treści","outOfDate","thumb-down"],["Problem z tłumaczeniem","translationIssue","thumb-down"],["Problem z przykładami/kodem","samplesCodeIssue","thumb-down"],["Inne","otherDown","thumb-down"]],["Ostatnia aktualizacja: 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);"]]