Android NDK 开发中如何从Assets文件夹加载图片并上传纹理

发布时间:2021-12-08 17:53:17 作者:柒染
来源:亿速云 阅读:148

Android NDK 开发中如何从Assets文件夹加载图片并上传纹理,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

在 OpenGL 开发中,我们要渲染一张图片,通常先是得到一张图片对应的 Bitmap ,然后将该 Bitmap 作为纹理上传到 OpenGL 中。在 Android 中有封装好的 GLUtils 类的 texImage2D 方法供我们调用。

1    public static void texImage2D(int target, int level, int internalformat,
2            Bitmap bitmap, int type, int border)
3
 

该方法的底层原理实际上也是解析了该 Bitmap ,得到了 Bitmap 所有的像素数据,类似于 Android NDK 关于 Bitmap 操作的 AndroidBitmap_lockPixels 方法,如果你不太了解该方法,可以参考这篇文章:Android JNI 之 Bitmap 操作。

得到了所有像素数据之后,实际最终还是调用了 OpenGL 的 glTexImage2D 来实现纹理上传。当然,如果可以直接得到所有数据,也不需要走解析 Bitmap 这一步了,这种场景最常见的就是把相机作为输入了。


接下来我们会通过 Android NDK 开发中去渲染一张图片,步骤还是如上,从图像解析到纹理上传,不同的是我们将会解析 Assets 文件夹中的图片,而不是一张已经保存在手机 SDCard 上的图片。

相比于前者,SDCard 上的图片已经有了绝对地址了,直接把地址传到 stb_image 库就可以完成解析了(参考之前的文章 简单易用的图像解码库介绍 —— stb_image),而 Assets 文件夹的内容在手机上可没有绝对地址哦,不信你仔细回想,可曾在看到过 APK 安装后 Assets 文件夹对应的内容?

一开始陷入了误区,想着怎么去获得文件的绝对地址,看到了 AssetManager 的 AAsset_openFileDescriptor 方法以为拿到文件描述符就万事大吉了,结果打印的地址是这样的 /proc/9941/fd/79 ,这基本的不可用了。

换个思路,在 Java 中去加载 Assets 目录下的图片:

1InputStream is = getAssets().open(fileName); 
 

通过 AssertManager 的 open 方法直接拿到文件的输入流了。

而在 NDK 开发中同样的方式是行不通的,这里要采用另外一种方式,但其实意思都差不多的:

 1    // NDK 中是 AssetManager
2    AAssetManager *mgr = AAssetManager_fromJava(env, assetManager);
3    // 打开 Asset 文件夹下的文件
4    AAsset *pathAsset = AAssetManager_open(mgr, assetPath, AASSET_MODE_UNKNOWN);
5    // 得到文件的长度
6    off_t assetLength = AAsset_getLength(pathAsset);
7    // 得到文件对应的 Buffer
8    unsigned char *fileData = (unsigned char *) AAsset_getBuffer(pathAsset);
9    // stb_image 的方法,从内存中加载图片
10    unsigned char *contnet = stbi_load_from_memory(fileData, assetLength, &w, &h, &n, 0);
 

NDK 中可拿不到像 Java 那样的输入流,但是可以通过 AssetManager 的 AAsset_getBuffer 或者是 AAsset_read 方法去获取文件内容。

看到上面那两个 API 基本就稳了,再配合 stb_image 介绍过的方法,stbi_load_from_memory 从内存中加载图片的像素数据,最后就是 glTexImage2D 方法实现纹理上传。

关于Android NDK 开发中如何从Assets文件夹加载图片并上传纹理问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。

推荐阅读:
  1. cocos2d-x学习笔记(十)android自动化打包bat脚本
  2. Android音频开发(6):使用 OpenSL ES API(上)

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

android ndk assets

上一篇:导致uBAM迟迟无法流行起来的4个原因分别是什么

下一篇:如何深入理解Matplotlib3D 绘图函数plot_surface

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》