इमेज डिकोडर

NDK ImageDecoder एपीआई, Android C/C++ ऐप्लिकेशन के लिए स्टैंडर्ड एपीआई उपलब्ध कराता है, ताकि वे इमेज को सीधे डिकोड कर सकें. ऐप्लिकेशन डेवलपर को अब JNI के ज़रिए Java API या तीसरे पक्ष की इमेज डिकोड करने वाली लाइब्रेरी का इस्तेमाल करने की ज़रूरत नहीं है. यह एपीआई, Bitmap मॉड्यूल में मौजूद कोड में बदलने वाले फ़ंक्शन के साथ-साथ, ये काम करने की सुविधा देता है:

  • नेटिव ऐप्लिकेशन और लाइब्रेरी छोटी हो सकती हैं, क्योंकि अब उन्हें डिकोड करने वाली अपनी लाइब्रेरी को लिंक करने की ज़रूरत नहीं है.
  • ऐप्लिकेशन और लाइब्रेरी, प्लैटफ़ॉर्म की सुरक्षा से जुड़े अपडेट से अपने-आप फ़ायदा पाती हैं. इससे, लाइब्रेरी को डिकोड करने में मदद मिलती है.
  • ऐप्लिकेशन, इमेज को सीधे तौर पर अपनी उपलब्ध मेमोरी में डिकोड कर सकते हैं. इसके बाद, ऐप्लिकेशन (अगर चाहें) इमेज डेटा को पोस्ट-प्रोसेस कर सकते हैं और उसे OpenGL या अपने ड्रॉइंग कोड को पास कर सकते हैं.

इस पेज पर, किसी इमेज को डिकोड करने के लिए एपीआई का इस्तेमाल करने का तरीका बताया गया है.

उपलब्धता और सुविधा

ImageDecoder API, उन ऐप्लिकेशन पर उपलब्ध है जो Android 11 (एपीआई लेवल 30) या उसके बाद के वर्शन को टारगेट करते हैं. इसे लागू करने के लिए, इन फ़ाइलों का इस्तेमाल किया जाता है:

  • डिकोडर के लिए imagedecoder.h
  • एन्कोडर के लिए bitmap.h
  • libjnigraphics.so

यह API, इन इमेज फ़ॉर्मैट के साथ काम करता है:

  • JPEG
  • PNG
  • GIF
  • WebP
  • BMP

  • ICO

  • WBMP

  • HEIF

  • डिजिटल नेगेटिव (DNG SDK टूल की मदद से)

डिकोड की गई रॉ इमेज के सभी इस्तेमाल को कवर करने के लिए, यह एपीआई, Java फ़्रेमवर्क में डिकोड की गई इमेज के ऊपर बनाए गए ऑब्जेक्ट जैसे, हाई लेवल ऑब्जेक्ट उपलब्ध नहीं कराता. जैसे:

  • Drawable ऑब्जेक्ट.
  • NinePatch: अगर कोड में बदली गई इमेज में NinePatch चंक मौजूद हैं, तो उन्हें अनदेखा कर दिया जाता है.
  • बिटमैप डेंसिटी: AImageDecoder, स्क्रीन की डेंसिटी के आधार पर, साइज़ में अपने-आप बदलाव नहीं करता. हालांकि, यह AImageDecoder_setTargetSize() की मदद से, किसी दूसरे साइज़ में डिकोड करने की अनुमति देता है.
  • ऐनिमेशन: सिर्फ़ ऐनिमेटेड GIF या WebP फ़ाइल के पहले फ़्रेम को डिकोड करता है.

इमेज को डिकोड करना

डिकोडिंग की प्रोसेस, कोड में बदली गई इमेज को दिखाने वाले किसी इनपुट से शुरू होती है. AImageDecoder कई तरह के इनपुट स्वीकार करता है:

  • AAsset (यहां दिखाया गया है)
  • फ़ाइल डिस्क्रिप्टर
  • बफ़र

यहां दिए गए कोड में, किसी फ़ाइल से इमेज Asset खोलने, उसे डिकोड करने, और फिर डिकोडर और एसेट को सही तरीके से हटाने का तरीका बताया गया है. डिकोड की गई इमेज को रेंडर करने का उदाहरण देखने के लिए, टीपोट का सैंपल देखें.

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);