ইমেজ ডিকোডার

এনডিকে ImageDecoder এপিআই অ্যান্ড্রয়েড সি/সি++ অ্যাপের জন্য সরাসরি ইমেজ ডিকোড করার একটি স্ট্যান্ডার্ড এপিআই প্রদান করে। অ্যাপ ডেভেলপারদের আর জাভা এপিআই (জেএনআই-এর মাধ্যমে) বা থার্ড-পার্টি ইমেজ ডিকোডিং লাইব্রেরি ব্যবহার করার প্রয়োজন নেই। এই এপিআই, বিটম্যাপ মডিউলের এনকোডিং ফাংশনগুলোর সাথে মিলে নিম্নলিখিত বিষয়গুলো সক্ষম করে:

  • নেটিভ অ্যাপ এবং লাইব্রেরিগুলো আকারে ছোট হতে পারে, কারণ সেগুলোকে আর নিজেদের ডিকোডিং লাইব্রেরি লিঙ্ক করতে হয় না।
  • ডিকোডিং লাইব্রেরির জন্য প্ল্যাটফর্ম নিরাপত্তা আপডেট থেকে অ্যাপ এবং লাইব্রেরিগুলো স্বয়ংক্রিয়ভাবে উপকৃত হয়।
  • অ্যাপগুলো সরাসরি তাদের সরবরাহ করা মেমরিতে ছবি ডিকোড করতে পারে। এরপর অ্যাপগুলো (ইচ্ছা হলে) ছবির ডেটা পোস্ট-প্রসেস করে তা OpenGL বা তাদের ড্রয়িং কোডে পাঠাতে পারে।

এই পৃষ্ঠায় বর্ণনা করা হয়েছে কীভাবে এপিআই ব্যবহার করে একটি ছবি ডিকোড করতে হয়।

প্রাপ্যতা এবং সক্ষমতা

ImageDecoder API-টি Android 11 (API লেভেল 30) বা তার উচ্চতর সংস্করণ টার্গেট করা অ্যাপগুলিতে উপলব্ধ। এর ইমপ্লিমেন্টেশনটি নিম্নলিখিত ফাইলগুলির মধ্যে রয়েছে:

  • ডিকোডারের জন্য imagedecoder.h
  • এনকোডারের জন্য bitmap.h
  • libjnigraphics.so

এপিআইটি নিম্নলিখিত ইমেজ ফরম্যাটগুলো সমর্থন করে:

  • জেপিইজি
  • পিএনজি
  • জিআইএফ
  • ওয়েবপি
  • বিএমপি

  • আইসিও

  • ডব্লিউবিএমপি

  • হেইফ

  • ডিজিটাল নেগেটিভ (DNG SDK এর মাধ্যমে)

ডিকোড করা র ইমেজগুলির সমস্ত ব্যবহার অন্তর্ভুক্ত করার জন্য, এই API জাভা ফ্রেমওয়ার্কের অভ্যন্তরে ডিকোড করা ইমেজগুলির উপর ভিত্তি করে নির্মিত উচ্চ-স্তরের অবজেক্টগুলি প্রদান করে না, যেমন:

  • Drawable বস্তুসমূহ
  • 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);