Android中利用C++處理Bitmap對象的實現(xiàn)方法
相信有些Android&圖像算法開發(fā)者和我一樣,遇到過這樣的狀況:要對Bitmap對象做一些密集計算(例如逐像素的濾波),但是在java層寫循環(huán)代碼來逐像素操作明顯是不現(xiàn)實的,因為Java代碼的運行速度太慢,而一副很小的240*320圖像就有76800個像素,如果考慮到RGB三通道(或者ARGB四通道),還要對這個數(shù)量乘以3/4。因此對圖像的密集計算一般都利用Jni接口,用C++實現(xiàn)。那么問題來了,怎么把Bitmap中的像素數(shù)據(jù)從Java層傳到C++層?
做法1:之前的做法
我之前的做法是這樣的,因為Bitmap類不支持直接獲取像素數(shù)據(jù),因此我利用copyPixelsToBuffer函數(shù)將像素數(shù)據(jù)復(fù)制到一塊buffer中,再將buffer數(shù)據(jù)傳到C++層中做處理,處理完成后,再使用copyPixelsFromBuffer函數(shù)將處理完的像素數(shù)據(jù)賦給Bitmap對象。這種方法的缺點是,需要額外申請一塊幾乎和當前圖像等大的內(nèi)存塊作為buffer,還要增加兩次額外的復(fù)制操作。本來我們利用C++處理像素的目的就是節(jié)省時間,現(xiàn)在額外的需求使得時間和空間復(fù)雜度都增加了,可見,這種方式并不經(jīng)濟實惠。
做法2:現(xiàn)在的做法
其實,Android的NDK可以在一定程度上處理從Java層傳過來的Bitmap對象,可以將Bitmap對象傳到C++層,直接獲取其中的像素數(shù)據(jù)指針,做進一步處理。步驟如下:
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.獲取像素數(shù)據(jù)指針,進行操作
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**),因為Android中的Bitmap一般存放的是ARGB格式,如果需要的是像素,可以用int*指針,如果需要的是通道,可以用unsigned char*。
d.操作完畢,釋放指針
AndroidBitmap_unlockPixels(env,bmpObj);
這樣,不需要做任何復(fù)制操作,就可以直接操作Bitmap中的像素數(shù)據(jù)。
3.其他問題
如果需要在C++層創(chuàng)建Bitmap對象,再返回到Java層,這種需求我還沒找到具體的實現(xiàn)方法,如果有人知道,請不吝指點
以上這篇Android中利用C++處理Bitmap對象的實現(xiàn)方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Android自定義控件仿iOS滑塊SwitchButton
這篇文章主要為大家詳細介紹了Android自定義控件模仿iOS滑塊SwitchButton,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-12-12
Android開發(fā)筆記SQLite優(yōu)化記住密碼功能
這篇文章主要為大家詳細介紹了Android開發(fā)筆記SQLite優(yōu)化記住密碼功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07
Android中Fragment子類及其PreferenceFragment的創(chuàng)建過程演示
這篇文章主要介紹了Android中Fragment子類及其PreferenceFragment的創(chuàng)建過程演示,PreferenceFragment用來保存Fragment的選項設(shè)置,需要的朋友可以參考下2016-05-05
Android開發(fā)之TabHost選項卡及相關(guān)疑難解決方法
這篇文章主要介紹了Android開發(fā)之TabHost選項卡及相關(guān)疑難解決方法,結(jié)合實例形式較為詳細的分析了Android開發(fā)中TabHost選項卡的常見用法以及相關(guān)疑難問題解決方法,需要的朋友可以參考下2019-03-03
Android自定義ViewGroup實現(xiàn)右滑進入詳情
這篇文章主要為大家詳細介紹了Android如何通過自定義ViewGroup實現(xiàn)右滑進入詳情效果,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下2023-01-01

