इमेज डिकोडर

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

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

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

उपलब्धता और क्षमता

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

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

एपीआई, नीचे दिए गए इमेज फ़ॉर्मैट के साथ काम करता है:

  • JPEG
  • PNG
  • GIF
  • WebP फ़ॉर्मैट
  • BMP

  • ICO

  • WBMP

  • एचईआईएफ़

  • डिजिटल नेगेटिव (डीएनजी SDK टूल के ज़रिए)

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

  • Drawable ऑब्जेक्ट.
  • NinePatch: अगर किसी कोड में बदली गई इमेज, NikePatch के हिस्सों को अनदेखा कर दिया जाएगा.
  • बिटमैप का डेंसिटी: 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);