Android中利用C++處理Bitmap對(duì)象的實(shí)現(xiàn)方法
相信有些Android&圖像算法開發(fā)者和我一樣,遇到過這樣的狀況:要對(duì)Bitmap對(duì)象做一些密集計(jì)算(例如逐像素的濾波),但是在java層寫循環(huán)代碼來逐像素操作明顯是不現(xiàn)實(shí)的,因?yàn)镴ava代碼的運(yùn)行速度太慢,而一副很小的240*320圖像就有76800個(gè)像素,如果考慮到RGB三通道(或者ARGB四通道),還要對(duì)這個(gè)數(shù)量乘以3/4。因此對(duì)圖像的密集計(jì)算一般都利用Jni接口,用C++實(shí)現(xiàn)。那么問題來了,怎么把Bitmap中的像素?cái)?shù)據(jù)從Java層傳到C++層?
做法1:之前的做法
我之前的做法是這樣的,因?yàn)锽itmap類不支持直接獲取像素?cái)?shù)據(jù),因此我利用copyPixelsToBuffer函數(shù)將像素?cái)?shù)據(jù)復(fù)制到一塊buffer中,再將buffer數(shù)據(jù)傳到C++層中做處理,處理完成后,再使用copyPixelsFromBuffer函數(shù)將處理完的像素?cái)?shù)據(jù)賦給Bitmap對(duì)象。這種方法的缺點(diǎn)是,需要額外申請一塊幾乎和當(dāng)前圖像等大的內(nèi)存塊作為buffer,還要增加兩次額外的復(fù)制操作。本來我們利用C++處理像素的目的就是節(jié)省時(shí)間,現(xiàn)在額外的需求使得時(shí)間和空間復(fù)雜度都增加了,可見,這種方式并不經(jīng)濟(jì)實(shí)惠。
做法2:現(xiàn)在的做法
其實(shí),Android的NDK可以在一定程度上處理從Java層傳過來的Bitmap對(duì)象,可以將Bitmap對(duì)象傳到C++層,直接獲取其中的像素?cái)?shù)據(jù)指針,做進(jìn)一步處理。步驟如下:
a.編寫JNI接口函數(shù)
//java接口函數(shù) private static native int processBitmap(Bitmap bitmap); //對(duì)應(yīng)C++函數(shù) JNIEXPORT jint JNICALL Java_com_example_test_nativeprocess_processBitmap (JNIEnv *env, jclass,jobject bmpObj);
b.添加#include<android/bitmap.h>語句
#include<android/bitmap.h>
c.獲取像素?cái)?shù)據(jù)指針,進(jìn)行操作
AndroidBitmapInfo bmpInfo={0}; if(AndroidBitmap_getInfo(env,bmpObj,&bmpInfo)<0) {return -1} int* dataFromBmp=NULL; if(AndroidBitmap_lockPixels(env,bmpObj,(void**)&dataFromBmp)) {return -1;}
AndroidBitmap_lockPixels用來獲取數(shù)據(jù)指針,數(shù)據(jù)指針的參數(shù)類型是(void**),因?yàn)锳ndroid中的Bitmap一般存放的是ARGB格式,如果需要的是像素,可以用int*指針,如果需要的是通道,可以用unsigned char*。
d.操作完畢,釋放指針
AndroidBitmap_unlockPixels(env,bmpObj);
這樣,不需要做任何復(fù)制操作,就可以直接操作Bitmap中的像素?cái)?shù)據(jù)。
3.其他問題
如果需要在C++層創(chuàng)建Bitmap對(duì)象,再返回到Java層,這種需求我還沒找到具體的實(shí)現(xiàn)方法,如果有人知道,請不吝指點(diǎn)
以上這篇Android中利用C++處理Bitmap對(duì)象的實(shí)現(xiàn)方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Android List(集合)中的對(duì)象以某一個(gè)字段排序案例
- Android使用FontMetrics對(duì)象計(jì)算位置坐標(biāo)
- Android使用Canvas對(duì)象實(shí)現(xiàn)刮刮樂效果
- Android編程實(shí)現(xiàn)全局獲取Context及使用Intent傳遞對(duì)象的方法詳解
- Android中將Bitmap對(duì)象以PNG格式保存在內(nèi)部存儲(chǔ)中的方法
- Android中實(shí)現(xiàn)長按修改ListView對(duì)象的內(nèi)容
- Android中傳遞對(duì)象的三種方法的實(shí)現(xiàn)
- Android中深入學(xué)習(xí)對(duì)象的四種引用類型
相關(guān)文章
Android編程解析Json格式數(shù)據(jù)的方法
這篇文章主要介紹了Android編程解析Json格式數(shù)據(jù)的方法,涉及Android中json格式數(shù)據(jù)的構(gòu)造、讀取及遍歷等技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11Android中AutoCompleteTextView與MultiAutoCompleteTextView的用法
這篇文章主要介紹了Android中AutoCompleteTextView與MultiAutoCompleteTextView的用法,需要的朋友可以參考下2014-07-07Android自定義ActionProvider ToolBar實(shí)現(xiàn)Menu小紅點(diǎn)
這篇文章主要介紹了Android自定義ActionProvider ToolBar實(shí)現(xiàn)Menu小紅點(diǎn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09AndroidStudio Gradle基于友盟的多渠道打包方法
這篇文章主要介紹了AndroidStudio Gradle基于友盟的多渠道打包方法,需要的朋友可以參考下2017-09-09Android實(shí)現(xiàn)簡易計(jì)算功能
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)簡易計(jì)算功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06Android Studio實(shí)現(xiàn)QQ的注冊登錄和好友列表跳轉(zhuǎn)
最近做了一個(gè)項(xiàng)目,這篇文章主要介紹了Android Studio界面跳轉(zhuǎn),本次項(xiàng)目主要包含了注冊、登錄和好友列表三個(gè)界面以及之間相互跳轉(zhuǎn),感興趣的可以了解一下2021-05-05Android 中WebView 截圖的實(shí)現(xiàn)方式
這篇文章主要介紹了Android 中WebView 截圖的實(shí)現(xiàn)方式,WebView 作為一種特殊的控件,自然不能像其他系統(tǒng) View 或者截屏的方式來獲取截圖。本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2017-12-12Android開發(fā)中TextView各種常見使用方法小結(jié)
這篇文章主要介紹了Android開發(fā)中TextView各種常見使用方法,結(jié)合實(shí)例形式總結(jié)分析了Android開發(fā)中TextView各種常見布局與功能實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-04-04