NDK ImageDecoder API, Android C/C++ uygulamalarının görüntülerin kodunu doğrudan çözmesi için standart bir API sağlar. Uygulama geliştiricilerin artık Java API'lerini (JNI aracılığıyla) veya üçüncü taraf resim kod çözme kitaplıklarını kullanması gerekmez. Bu API, Bitmap modülündeki kodlama işlevleriyle birlikte aşağıdakileri sağlar:
- Yerel uygulamalar ve kitaplıklar, artık kendi kod çözme kitaplıklarını bağlamak zorunda olmadıkları için daha küçük olabilir.
- Uygulamalar ve kitaplıklar, kod çözme kitaplıklarına yönelik platform güvenlik güncellemelerinden otomatik olarak yararlanır.
- Uygulamalar, görüntülerin kodunu doğrudan kendi sağladıkları belleğe çözebilir. Uygulamalar daha sonra görüntü verilerini sonradan işleyebilir (istenirse) ve OpenGL'ye veya çizim kodlarına iletebilir.
Bu sayfada, bir görüntünün kodunu çözmek için API'nin nasıl kullanılacağı açıklanmaktadır.
Kullanılabilirlik ve özellikler
ImageDecoder API'si, Android 11 (API düzeyi 30) veya sonraki sürümleri hedefleyen uygulamalarda kullanılabilir. Uygulama aşağıdaki dosyalarda yer alır:
- 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 aracılığıyla)
Bu API, kodu çözülmüş ham resimlerin tüm kullanımlarını kapsamak için Java çerçevesindeki kodu çözülmüş resimlerin üzerine oluşturulanlar gibi daha üst düzey nesneler sağlamaz. Örneğin:
Drawablenesne.NinePatch: Kodlanmış bir resimde varsa NinePatch parçaları yoksayılır.- Bitmap yoğunluğu:
AImageDecoder, ekranın yoğunluğuna göre otomatik boyut ayarlaması yapmaz ancakAImageDecoder_setTargetSize()aracılığıyla farklı bir boyuta kod çözmeye olanak tanır. - Animasyonlar: Hareketli GIF veya WebP dosyasının yalnızca ilk karesinin kodunu çözer.
Resmin kodunu çözme
Kod çözme işlemi, kodlanmış görüntüyü temsil eden bir giriş biçimiyle başlar.
AImageDecoder, birden fazla giriş türünü kabul eder:
AAsset(aşağıda gösterilmiştir)- Dosya tanımlayıcı
- Arabellek
Aşağıdaki kodda, bir dosyadan resim Asset açma, resmin kodunu çözme ve ardından kod çözücüyü ve öğeyi doğru şekilde silme işlemi gösterilmektedir. Kodu çözülen görüntünün oluşturulmasıyla ilgili bir örnek için çaydanlık örneğine bakın.
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);