91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android NDK 開發中如何從Assets文件夾加載圖片并上傳紋理

發布時間:2021-12-08 17:53:17 來源:億速云 閱讀:145 作者:柒染 欄目:大數據

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文件夾加載圖片并上傳紋理問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

苍南县| 楚雄市| 庆安县| 绿春县| 平潭县| 高密市| 靖远县| 玉树县| 赫章县| 宾川县| 济宁市| 怀仁县| 泾源县| 贺州市| 友谊县| 兴宁市| 台安县| 美姑县| 呼伦贝尔市| 莱西市| 静宁县| 扎鲁特旗| 金乡县| 府谷县| 浙江省| 临桂县| 晋宁县| 盐池县| 旬邑县| 开阳县| 江门市| 东明县| 舒城县| 顺平县| 广宗县| 嘉峪关市| 柞水县| 铜陵市| 襄汾县| 宁陕县| 商丘市|