Resim kod çözücüsü

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 görüntü kodu çözme kitaplıkları kullanmalarına gerek yoktur. Bu API, Bitmap modülündeki kodlama işlevleriyle birlikte şunları etkinleştirir:

  • Artık kendi kod çözme kitaplıklarını bağlamak zorunda kalmadıkları için yerel uygulamalar ve kitaplıklar daha küçük olabilir.
  • Uygulamalar ve kitaplıklar, platform güvenliği güncellemelerinden kitaplıkların kodunun çözülmesine kadar otomatik olarak yararlanır.
  • Uygulamalar, resimlerin kodunu doğrudan sağladıkları belleğe dönüştürebilir. Uygulamalar, daha sonra resim verilerini sonradan işleyebilir (isterse) ve OpenGL'ye veya çizim kodlarına geçirebilirler.

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, Android 11 (API düzeyi 30) veya sonraki sürümleri hedefleyen uygulamalarda kullanılabilir. 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 aracılığıyla)

Bu API, kodu çözülmüş ham görüntülerin tüm kullanımlarını kapsayacak şekilde, Java çerçevesi içindeki kodu çözülmüş görüntülerin üzerine oluşturulanlar gibi daha üst düzey nesneler sağlamaz. Örneğin:

  • Drawable nesne.
  • NinePatch: Kodlanmış bir görüntüde mevcutsa NinePatch parçaları yoksayılır.
  • Bit eşlem yoğunluğu: AImageDecoder, ekranın yoğunluğuna göre otomatik boyut düzenlemesi yapmaz ancak AImageDecoder_setTargetSize() aracılığıyla farklı bir boyut için kod çözmeyi sağlar.
  • Animasyonlar: Yalnızca animasyonlu bir GIF veya WebP dosyasının ilk karesinin kodunu çözer.

Görüntülerin kodunu çözme

Kod çözme, kodlanmış görüntüyü temsil eden bir tür girişle 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 kod, dosyadan bir resmin Asset nasıl açılacağını, kodun nasıl çözüleceğini ve ardından kod çözücü ile öğenin nasıl uygun şekilde imha edileceğini gösterir. Kodu çözülmüş resmin oluşturulmasıyla ilgili 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);