NDK ImageDecoder
API'si, Android C/C++ uygulamalarının görüntüleri doğrudan kodunu çö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ı gerekmiyor. Bu API, Bitmap modülündeki kodlama işlevleriyle birlikte aşağıdakileri sağlar:
- Yerel uygulamalar ve kitaplıklar, 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, resimleri doğrudan sağladıkları bellekte çözebilir. Uygulamalar daha sonra görüntü verilerini (istenirse) işleyebilir ve OpenGL'ye veya kendi çizim kodlarına aktarabilir.
Bu sayfada, bir resmi kod çözmek için API'nin nasıl kullanılacağı açıklanmaktadır.
Kullanılabilirlik ve özellik
ImageDecoder
API, Android 11 (API düzeyi 30) veya sonraki sürümleri hedefleyen uygulamalarda kullanılabilir. Uygulama aşağıdaki dosyaların içinde yer alır:
imagedecoder.h
kod çözücü içinbitmap.h
(kodlayıcı için)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, çözülmüş ham görüntülerin tüm kullanımlarını kapsamak için Java çerçevesi içinde çözülmüş görüntülerin üzerine oluşturulanlar gibi daha üst düzey nesneler sağlamaz. Örneğin:
Drawable
nesne.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 çözme işlemine izin verir. - Animasyonlar: Yalnızca animasyonlu GIF veya WebP dosyasının ilk karesini çözer.
Resim kodu çö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ısı
- Arabellek
Aşağıdaki kod, bir dosyadan Asset
resminin nasıl açılacağını, kodunun nasıl çözüleceğini ve ardından kod çözücünün ve öğenin nasıl düzgün şekilde kaldırılacağını gösterir. Kod çözme işlemi yapılan görüntünün oluşturulmasına ilişkin bir örnek görmek 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);