NDK ImageDecoder
API,
Android C/C++ uygulamaları için standart API'dir. Uygulama geliştiriciler no
Java API'lerini (JNI aracılığıyla) veya üçüncü taraf resim kod çözmeyi kullanmaya daha uzun süre ihtiyaç duyma
kitaplıklar. Bu API,
Bitmap modülü şunları sağlar:
- Yerel uygulamalar ve kitaplıklar, artık bağlanmaları gerekmedikleri için daha küçük olabilir kendi kod çözme kitaplıklarına sahip.
- Uygulamalar ve kitaplıklar, kitaplığının kodunu çözme.
- Uygulamalar, resimlerin kodunu doğrudan sağladıkları bellekte çözebilir. Uygulamalar böylece resim verilerini son işlemden geçirmek (istenirse) ve OpenGL ya da anlamına gelir.
Bu sayfada, bir resmin kodunu çözmek için API'nin nasıl kullanılacağı açıklanmaktadır.
Kullanılabilirlik ve kapasite
ImageDecoder
API, Android 11'i (API düzeyi 30) hedefleyen uygulamalarda kullanılabilir
veya daha yüksek olabilir. Uygulama aşağıdaki dosyaların içindedir:
- Kod çözücü için
imagedecoder.h
- Kodlayıcı için
bitmap.h
libjnigraphics.so
API aşağıdaki resim biçimlerini destekler:
- JPEG
- PNG
- GIF
- WebP
BMP
ICO
WBMP
HeIF
Dijital negatifler (DNG SDK'sı aracılığıyla)
Bu API, kodu çözülmüş ham görüntülerin tüm kullanımlarını kapsayacak şekilde kodu çözülmüş resimlerin üzerine inşa edilenler gibi daha yüksek seviye nesneler sağlar. kullanabilirsiniz, örneğin:
Drawable
nesne.NinePatch
: kodlanmış resim, NinePatch parçaları yoksayılır.- Bit eşlem yoğunluğu:
AImageDecoder
, ancak farklı bir boyuta kod çözme olanağı sağlar.AImageDecoder_setTargetSize()
. - Animasyonlar: Yalnızca animasyonlu bir GIF veya WebP dosyasının ilk karesinin kodunu çözer.
Bir resmin kodunu çözme
Kod çözme işlemi, kodlanmış resmi temsil eden bir giriş türüyle başlar.
AImageDecoder
birden fazla giriş türünü kabul eder:
AAsset
(aşağıda gösterilmektedir)- Dosya açıklayıcı
- Tampon
Aşağıdaki kodda, dosyadan Asset
resminin nasıl açılacağı ve kodunun nasıl çözüldüğü gösterilmektedir
Ardından kod çözücüyü ve öğeyi uygun şekilde imha edin. Şunun bir örneğini görmek için:
kodu çözülmüş resmi oluşturmak için
demlik numunesi.
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);