AndroidDev 板


LINE

假如想對一張圖的 像素點做操作運算的話 在JDK上的步驟 步驟如下 --附註:圖片演算法處理部分 可能不是很準確 僅供參考 沒有特別宣告出來的變數 請當成已經宣告並有設值 例如alpha Bitmap b1 = ....//取得一張圖 for(int x=0;x<b1.getWidth();x++){ for(int y=0;y<b1.getHeight();y++){ argb = b1.getPixel(x,y);//取得原始色彩 argb = (alpha<<24) | (argb & 0x00FFFFFF);//做透明度變更 b1.setPixel(x,y, argb);//寫入新色彩 } } 但以這述例子來說 每個點要操作3次 如果是400*300 大小的圖的話 總要要進行400*300*3 = 36萬次的運算操作 這僅只是一張圖而已 如果想做流暢的動畫圖片 那更可觀 ----------------------------------------------------------- 而JDK有提供另一個方法去取得圖的像素點 int size = width * height; int[] pixel = new int[size];//先宣告記憶體配置大小 b1.getPixels(pixel, 0, width, 0, 0, width, height);//取得像素點 for(int t=0;t<size;t++){ pixel[i] = (alpha<<24) | (pixel[i] & 0x00FFFFFF);//做透明度變更 } b1.setPixels(pixel, 0, width, 0, 0, width, height);//將像素點寫入 以這種方法來看 確實比前例快了 因為迴圈每次只作一次操作 處理時間 = 12萬次 + getPixels + setPixels 但會發現 運算速度是瓶頸之一 因此必須藉由更快的方法去做點運算 ------------------------------------------------------------ NDK 是android中 可以利用C語言去做運算處理的一個機制方法 可以解決大量運算在JAVA中緩慢的問題 以上述例子來說 我們把整個for回圈的運算部分 丟給C處理 最後再將結果回傳給JAVA --c JNIEXPORT jintArray compute( JNIEnv* env, jobject thiz, jintArray ref, jint size )//從java丟了一個pixelArray跟size大小過來 { //將array 寫入int指標中 jint *pixel = (*env)->GetIntArrayElements(env, ref, NULL); int t; for(t=0;t<size;t++){ pixel[i] = (alpha<<24) | (pixel[i] & 0x00FFFFFF);//做透明度變更 } (*env)->SetIntArrayRegion(env, ref, 0, size, pixel);//寫回array return ref; } --java int size = width * height; int[] pixel = new int[size];//先宣告記憶體配置大小 b1.getPixels(pixel, 0, width, 0, 0, width, height);//取得像素點 pixel = compute( pixel, size );//java call c then get return array b1.setPixels(pixel, 0, width, 0, 0, width, height);//將像素點寫 如果需要做圖片運算處理的動畫 透過C去加快運算部分 會有很大的處理速度改善 ---------------------------------------------------------------- 但如果對這樣的速度還是很不滿意 因為如果做動畫處理 每次c算完 回到java都還要再做一次 setPixels這個操作 實在太花時間 還好ndk可以直接對bitmap做指標操作處理 --c #include <android/bitmap.h>//必須要載入此類別 JNIEXPORT void compute( JNIEnv* env, jobject thiz, jobject bmp ){//直接從java丟一張圖過來 jclass m_class; jmethodID m_id; m_class = (*env)->FindClass( env, "JavaClassName"); //取得java 類別的位置與名稱 m_id = (*env)->GetStaticMethodID( env, m_class , "update" , "()V" ); //透過此類別取得你要呼叫的java 方法 AndroidBitmapInfo info; AndroidBitmap_getInfo(env, bmp, &info);//取得圖片資訊 int size = info.width * info.height;//透過info取得所要資訊 void* _bmp; AndroidBitmap_lockPixels(env, bmp, &_bmp);//將圖片的記憶體參考到 宣告的指標 int* pixel = (int*)_bmp;//強制型別轉換 以便運算 int i; for(i=0;i<size;i++){ pixel[i] = (alpha<<24) | (pixel[i] & 0x00FFFFFF);//做透明度變更 } AndroidBitmap_unlockPixels(env, bmp);//解除參考 (*env)->CallStaticVoidMethod( env, m_class, m_id); //事情做完了 c call java去更新畫面 } --java Bitmap b1 = ....//取得一張 start(){ compute(b1); } update(){ ImageView.setImageBitmap(b1);//透過類似方法將結果顯示在畫面上 } ----------------------------------------------------------------- 參考資料 JNI 基本觀念 http://cheng-min-i-taiwan.blogspot.com/2011/04/java-native-interface-jni.html JNI 基本使用 http://cheng-min-i-taiwan.blogspot.com/2010/06/android-ndk-hellojni.html c call java http://changyy.pixnet.net/blog/post/29469121 ----------------------------------------------------------------- 後記 以上是這幾個禮拜的研究心得整理 因為要在android上作2D動畫 所以必須盡可能找到越快的處理方法 但無奈即使是在JNI上 如果要做 乘法運算還是會有嚴重的處理時間 因此下一個研究方向 可能就是用opengl去算圖了 --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.170.153.165
1F:推 gpc:基本上直接上opengl就可以了.. 06/08 14:16
2F:→ VVll:opengl 我不懂阿XD 06/08 15:07
3F:推 lovelycateye:不考慮一下cocos2d-x嗎? 06/08 22:52







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:BuyTogether站內搜尋

TOP