أداة فك ترميز الصور

توفّر واجهة برمجة التطبيقات NDK ImageDecoder واجهة برمجة تطبيقات عادية لتطبيقات Android C/C++ لفك ترميز الصور مباشرةً. لم يعُد مطوِّرو التطبيقات بحاجة إلى استخدام واجهات برمجة تطبيقات Java (عبر JNI) أو مكتبات فك ترميز الصور التابعة لجهات خارجية. تتيح واجهة برمجة التطبيقات هذه، إلى جانب وظائف الترميز في وحدة الخريطة النقطية، ما يلي:

  • يمكن أن تكون التطبيقات والمكتبات الأصلية أصغر حجمًا لأنّها لم تعُد مضطرة إلى ربط مكتبات فك الترميز الخاصة بها.
  • تستفيد التطبيقات والمكتبات تلقائيًا من تحديثات الأمان للنظام الأساسي إلى مكتبات فك الترميز.
  • يمكن للتطبيقات فك ترميز الصور مباشرةً في الذاكرة التي توفّرها. ويمكن للتطبيقات بعد ذلك معالجة بيانات الصورة بعد ذلك (إذا لزم الأمر) وتمريرها إلى OpenGL أو رمز الرسم الخاص بها.

توضّح هذه الصفحة كيفية استخدام واجهة برمجة التطبيقات لفك ترميز صورة.

التوفّر والإمكانات

تتوفّر واجهة برمجة التطبيقات ImageDecoder API على التطبيقات التي تستهدف الإصدار 11 من Android (المستوى 30 لواجهة برمجة التطبيقات) أو الإصدارات الأحدث. عملية التنفيذ موجودة في الملفات التالية:

  • imagedecoder.h لبرنامج فك الترميز
  • bitmap.h لبرنامج الترميز
  • libjnigraphics.so

تتيح واجهة برمجة التطبيقات استخدام تنسيقات الصور التالية:

  • صور 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);