最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android中利用C++處理Bitmap對(duì)象的實(shí)現(xiàn)方法

 更新時(shí)間:2017年03月10日 10:01:32   投稿:jingxian  
下面小編就為大家?guī)?lái)一篇Android中利用C++處理Bitmap對(duì)象的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

相信有些Android&圖像算法開(kāi)發(fā)者和我一樣,遇到過(guò)這樣的狀況:要對(duì)Bitmap對(duì)象做一些密集計(jì)算(例如逐像素的濾波),但是在java層寫(xiě)循環(huán)代碼來(lái)逐像素操作明顯是不現(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)。那么問(wèn)題來(lái)了,怎么把Bitmap中的像素?cái)?shù)據(jù)從Java層傳到C++層?

做法1:之前的做法

我之前的做法是這樣的,因?yàn)锽itmap類(lèi)不支持直接獲取像素?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)是,需要額外申請(qǐng)一塊幾乎和當(dāng)前圖像等大的內(nèi)存塊作為buffer,還要增加兩次額外的復(fù)制操作。本來(lái)我們利用C++處理像素的目的就是節(jié)省時(shí)間,現(xiàn)在額外的需求使得時(shí)間和空間復(fù)雜度都增加了,可見(jiàn),這種方式并不經(jīng)濟(jì)實(shí)惠。

做法2:現(xiàn)在的做法

其實(shí),Android的NDK可以在一定程度上處理從Java層傳過(guò)來(lái)的Bitmap對(duì)象,可以將Bitmap對(duì)象傳到C++層,直接獲取其中的像素?cái)?shù)據(jù)指針,做進(jìn)一步處理。步驟如下:

a.編寫(xiě)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>語(yǔ)句

#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用來(lái)獲取數(shù)據(jù)指針,數(shù)據(jù)指針的參數(shù)類(lèi)型是(void**),因?yàn)锳ndroid中的Bitmap一般存放的是ARGB格式,如果需要的是像素,可以用int*指針,如果需要的是通道,可以用unsigned char*。

d.操作完畢,釋放指針

AndroidBitmap_unlockPixels(env,bmpObj);

這樣,不需要做任何復(fù)制操作,就可以直接操作Bitmap中的像素?cái)?shù)據(jù)。

3.其他問(wèn)題

如果需要在C++層創(chuàng)建Bitmap對(duì)象,再返回到Java層,這種需求我還沒(méi)找到具體的實(shí)現(xiàn)方法,如果有人知道,請(qǐng)不吝指點(diǎn)

以上這篇Android中利用C++處理Bitmap對(duì)象的實(shí)現(xiàn)方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

清水县| 临洮县| 美姑县| 舒兰市| 吴堡县| 邹平县| 潮州市| 耒阳市| 类乌齐县| 平安县| 建昌县| 临西县| 隆林| 镇赉县| 二连浩特市| 景泰县| 海安县| 阳城县| 汤阴县| 丽水市| 南靖县| 衡山县| 定结县| 淮南市| 文登市| 安陆市| 黔江区| 咸宁市| 冷水江市| 柳江县| 隆林| 法库县| 山东| 蒙城县| 松江区| 桃园县| 石首市| 西贡区| 芦溪县| 廉江市| 碌曲县|