Android NDK开发详解图像之图像解码器

Android NDK开发详解图像之图像解码器


NDK ImageDecoder API 提供了一种标准 API,供 Android C/C++ 应用直接解码图像。应用开发者不再需要使用 Java API(通过 JNI)或第三方图像解码库。此 API 与 Bitmap 模块中的编码函数结合使用,可实现以下功能:

缩减原生应用和库的大小,因为它们不再需要链接自己的解码库。
应用和库可自动从解码库的平台安全更新中受益。
应用可以直接将图像解码到其提供的内存中。如果需要的话,应用接下来可以对图像数据进行后处理,并将其传递给 OpenGL 或其绘制代码。
本页介绍了如何使用 API 解码图像。

可用性和功能

ImageDecoder API 适用于以 Android 11(API 级别 30)或更高版本为目标平台的应用。实现位于以下文件中:

imagedecoder.h,适用于解码器
bitmap.h,适用于编码器
libjnigraphics.so
该 API 支持以下图片格式:

JPEG
PNG
GIF
WebP
BMP

ICO

WBMP

HEIF

数字底片(通过 DNG SDK)

为了涵盖已解码原始图片的所有用法,此 API 不提供更高级别的对象,例如在 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);

本页面上的内容和代码示例受内容许可部分所述许可的限制。Java 和 OpenJDK 是 Oracle 和/或其关联公司的注册商标。

最后更新时间 (UTC):2023-11-13。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五一编程

程序之路有我与你同行

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值