NDK ImageDecoder API, Android C/C++ অ্যাপের জন্য
সরাসরি ছবি ডিকোড করার স্ট্যান্ডার্ড API প্রদান করে। অ্যাপ ডেভেলপারদের আর Java API (JNI-এর মাধ্যমে) বা থার্ড-পার্টি ইমেজ ডিকোডিং লাইব্রেরি ব্যবহার করতে হবে না। এই API, Bitmap মডিউলে এনকোডিং ফাংশনের সাথে, নিম্নলিখিতগুলি চালু করে:
- নেটিভ অ্যাপ ও লাইব্রেরি ছোট হতে পারে কারণ সেগুলিকে আর নিজেদের ডিকোডিং লাইব্রেরির সাথে লিঙ্ক করতে হয় না।
- ডিকোডিং লাইব্রেরিতে প্ল্যাটফর্ম নিরাপত্তা আপডেট থেকে অ্যাপ এবং লাইব্রেরিগুলি অটোমেটিক সুবিধা পায়।
- অ্যাপগুলি সরাসরি তাদের প্রদান করা মেমরিতে ছবি ডিকোড করতে পারে। অ্যাপগুলি তখন ছবির ডেটা পোস্ট-প্রসেস করতে পারে (যদি ইচ্ছা হয়) এবং এটি OpenGL বা তাদের ড্রয়িং কোডে পাস করতে পারে।
এই পৃষ্ঠায়, কোনও ছবি ডিকোড করার জন্য কীভাবে API ব্যবহার করতে হয় তা বর্ণনা করা হয়েছে।
উপলভ্যতা ও ক্ষমতা
ImageDecoder API সেইসব অ্যাপে উপলভ্য যেগুলি Android ১১ (API লেভেল ৩০)
বা তার পরবর্তী যেকোনও ভার্সনকে টার্গেট করে। নিম্নলিখিত ফাইলের মধ্যে ইমপ্লিমেন্টেশন আছে:
- ডিকোডারের জন্য
imagedecoder.h - এনকোডারের জন্য
bitmap.h libjnigraphics.so
API-তে নিম্নলিখিত ছবির ফর্ম্যাট কাজ করে:
- JPEG
- PNG
- GIF
- WebP
BMP
ICO
WBMP
HEIF
ডিজিটাল নেগেটিভ (DNG SDK-এর মাধ্যমে)
ডিকোড করা র' ছবির সব ব্যবহার কভার করার জন্য, এই API ডিকোড করা ছবির উপরে তৈরি করা অবজেক্টের মতো উচ্চ লেভেলের অবজেক্ট প্রদান করে না, যেমন:
Drawableটি অবজেক্ট।NinePatch: এনকোড করা ছবিতে NinePatch চাঙ্ক থাকলে, সেটি উপেক্ষা করা হয়।- বিটম্যাপ ডেনসিটি:
AImageDecoderস্ক্রিনের ডেনসিটির উপর ভিত্তি করে অটোমেটিক সাইজ অ্যাডজাস্টমেন্ট করে না, তবে এটিAImageDecoder_setTargetSize()-এর মাধ্যমে অন্য সাইজে ডিকোড করার অনুমতি দেয়। - অ্যানিমেশন: অ্যানিমেটেড GIF বা WebP ফাইলের শুধুমাত্র প্রথম ফ্রেম ডিকোড করে।
ছবি ডিকোড করা
এনকোড করা ছবিকে উপস্থাপন করে এমন কোনও ইনপুট দিয়ে ডিকোডিং শুরু হয়।
AImageDecoder একাধিক ধরনের ইনপুট গ্রহণ করে:
AAsset(নিচে দেখানো হয়েছে)- ফাইল ডেসক্রিপটর
- বাফার
নিচের কোড থেকে জানতে পারবেন কীভাবে ফাইল থেকে ছবি Asset খুলতে হয়, ডিকোড করতে হয়
এবং তারপর ডিকোডার ও অ্যাসেট সঠিকভাবে ডিসপোজ করতে হয়। ডিকোড করা ছবি রেন্ডার করার উদাহরণ দেখতে, teapot স্যাম্পেল দেখুন।
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);