رمزگشای تصویر

رابط برنامه‌نویسی کاربردی NDK ImageDecoder یک رابط برنامه‌نویسی کاربردی استاندارد برای برنامه‌های اندروید C/C++ فراهم می‌کند تا تصاویر را مستقیماً رمزگشایی کنند. توسعه‌دهندگان برنامه دیگر نیازی به استفاده از رابط‌های برنامه‌نویسی کاربردی جاوا (از طریق JNI) یا کتابخانه‌های رمزگشایی تصویر شخص ثالث ندارند. این رابط برنامه‌نویسی کاربردی، همراه با توابع رمزگذاری در ماژول Bitmap ، موارد زیر را فعال می‌کند:

  • برنامه‌ها و کتابخانه‌های بومی می‌توانند کوچک‌تر باشند زیرا دیگر نیازی به پیوند دادن کتابخانه‌های رمزگشایی خود ندارند.
  • برنامه‌ها و کتابخانه‌ها به‌طور خودکار از به‌روزرسانی‌های امنیتی پلتفرم برای رمزگشایی کتابخانه‌ها بهره‌مند می‌شوند.
  • برنامه‌ها می‌توانند تصاویر را مستقیماً در حافظه‌ای که در اختیارشان قرار می‌دهند، رمزگشایی کنند. سپس می‌توانند داده‌های تصویر را (در صورت تمایل) پس‌پردازش کرده و آن را به OpenGL یا کد طراحی خود منتقل کنند.

این صفحه نحوه استفاده از API برای رمزگشایی یک تصویر را شرح می‌دهد.

در دسترس بودن و قابلیت

رابط برنامه‌نویسی کاربردی ImageDecoder در برنامه‌هایی که اندروید ۱۱ (سطح API 30) یا بالاتر را هدف قرار می‌دهند، موجود است. پیاده‌سازی آن در فایل‌های زیر قرار دارد:

  • imagedecoder.h برای رمزگشا
  • bitmap.h برای رمزگذار
  • libjnigraphics.so

این API از فرمت‌های تصویری زیر پشتیبانی می‌کند:

  • JPEG
  • پی ان جی
  • گیف
  • وب پی
  • بی ام پی

  • ICO

  • WBMP

  • هیف

  • نگاتیوهای دیجیتال (از طریق DNG SDK)

به منظور پوشش تمام کاربردهای تصاویر خام رمزگشایی شده، این API اشیاء سطح بالاتری مانند اشیاء ساخته شده بر روی تصاویر رمزگشایی شده در چارچوب جاوا را ارائه نمی‌دهد، مانند:

  • اشیاء 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);