توفّر واجهة برمجة التطبيقات ImageDecoder في NDK واجهة برمجة تطبيقات عادية لتطبيقات C/C++ على Android لفك ترميز الصور مباشرةً. لم يعُد مطوّرو التطبيقات بحاجة إلى استخدام واجهات برمجة تطبيقات Java (من خلال JNI) أو مكتبات فك ترميز الصور التابعة لجهات خارجية. تتيح واجهة برمجة التطبيقات هذه، إلى جانب وظائف الترميز في وحدة Bitmap، ما يلي:
- يمكن أن تكون التطبيقات والمكتبات الأصلية أصغر حجمًا لأنّها لم تعد بحاجة إلى ربط مكتبات فك الترميز الخاصة بها.
- تستفيد التطبيقات والمكتبات تلقائيًا من تحديثات أمان النظام الأساسي لمكتبات فك الترميز.
- يمكن للتطبيقات فك ترميز الصور مباشرةً في الذاكرة التي توفّرها. يمكن للتطبيقات بعد ذلك معالجة بيانات الصورة (إذا رغبت في ذلك) وتمريرها إلى OpenGL أو رمز الرسم الخاص بها.
توضّح هذه الصفحة كيفية استخدام واجهة برمجة التطبيقات لفك ترميز صورة.
مدى التوفّر والإمكانات
تتوفّر واجهة برمجة التطبيقات ImageDecoder في التطبيقات التي تستهدف الإصدار 11 من نظام التشغيل Android (المستوى 30 لواجهة برمجة التطبيقات) أو الإصدارات الأحدث. يتم التنفيذ داخل الملفات التالية:
-
imagedecoder.hلأداة فك الترميز -
bitmap.hلبرنامج الترميز libjnigraphics.so
تتيح واجهة برمجة التطبيقات تنسيقات الصور التالية:
- JPEG
- PNG
- GIF
- تنسيق WebP
BMP
ICO
WBMP
HEIF
الصور السلبية الرقمية (من خلال حزمة تطوير البرامج (SDK) لملفات DNG)
لتغطية جميع استخدامات الصور الأولية التي تم فك ترميزها، لا توفّر واجهة برمجة التطبيقات هذه عناصر ذات مستوى أعلى مثل تلك التي تم إنشاؤها فوق الصور التي تم فك ترميزها داخل إطار عمل Java، مثل:
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);