Android中利用C++處理Bitmap對象的實(shí)現(xiàn)方法
相信有些Android&圖像算法開發(fā)者和我一樣,遇到過這樣的狀況:要對Bitmap對象做一些密集計(jì)算(例如逐像素的濾波),但是在java層寫循環(huán)代碼來逐像素操作明顯是不現(xiàn)實(shí)的,因?yàn)镴ava代碼的運(yùn)行速度太慢,而一副很小的240*320圖像就有76800個像素,如果考慮到RGB三通道(或者ARGB四通道),還要對這個數(shù)量乘以3/4。因此對圖像的密集計(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對象。這種方法的缺點(diǎn)是,需要額外申請一塊幾乎和當(dāng)前圖像等大的內(nèi)存塊作為buffer,還要增加兩次額外的復(fù)制操作。本來我們利用C++處理像素的目的就是節(jié)省時間,現(xiàn)在額外的需求使得時間和空間復(fù)雜度都增加了,可見,這種方式并不經(jīng)濟(jì)實(shí)惠。
做法2:現(xiàn)在的做法
其實(shí),Android的NDK可以在一定程度上處理從Java層傳過來的Bitmap對象,可以將Bitmap對象傳到C++層,直接獲取其中的像素?cái)?shù)據(jù)指針,做進(jìn)一步處理。步驟如下:
a.編寫JNI接口函數(shù)
//java接口函數(shù) private static native int processBitmap(Bitmap bitmap); //對應(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對象,再返回到Java層,這種需求我還沒找到具體的實(shí)現(xiàn)方法,如果有人知道,請不吝指點(diǎn)
以上這篇Android中利用C++處理Bitmap對象的實(shí)現(xiàn)方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Android編程解析Json格式數(shù)據(jù)的方法
這篇文章主要介紹了Android編程解析Json格式數(shù)據(jù)的方法,涉及Android中json格式數(shù)據(jù)的構(gòu)造、讀取及遍歷等技巧,具有一定參考借鑒價值,需要的朋友可以參考下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),具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-09-09AndroidStudio Gradle基于友盟的多渠道打包方法
這篇文章主要介紹了AndroidStudio Gradle基于友盟的多渠道打包方法,需要的朋友可以參考下2017-09-09Android實(shí)現(xiàn)簡易計(jì)算功能
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)簡易計(jì)算功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-06-06Android Studio實(shí)現(xiàn)QQ的注冊登錄和好友列表跳轉(zhuǎn)
最近做了一個項(xiàng)目,這篇文章主要介紹了Android Studio界面跳轉(zhuǎn),本次項(xiàng)目主要包含了注冊、登錄和好友列表三個界面以及之間相互跳轉(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