日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android提高十六篇之使用NDK把彩图转换灰度图

發布時間:2025/6/15 Android 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android提高十六篇之使用NDK把彩图转换灰度图 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在Android上使用JAVA實現彩圖轉換為灰度圖,跟J2ME上的實現類似,不過遇到頻繁地轉換或者是大圖轉換時,就必須使用NDK來提高速度了。本文主要通過JAVA和NDK這兩種方式來分別實現彩圖轉換為灰度圖,并給出速度的對比。

先來簡單地介紹一下Android的NDK使用步驟:

以NDK r4為例,或許以后新版的NDK的使用方法略有不同。
1、下載支持C++的android-ndk-r4-crystax,支持C++的話可玩性更強......
2、下載cygwin,選擇ftp://mirrors.kernel.org這個鏡像,搜索? Devel Install 安裝 gcc 和 make 等工具;

在搜索框里分別搜索gcc和make,必須是 Devel Install 欄的。

3、Cygwin安裝目錄下,找到home/username的目錄下的.bash_profile文件,打開文件在最后加上:
??? NDK=/cygdrive/d:cygwin/android-ndk-r4-crystax?
?? export NDK
PS:假設安裝在D:/cygwin/android-ndk-r4-crystax。
4、運行cygwin,通過cd命令去到NDK/samples/例子目錄/,運行$NDK/ndk-build來編譯該目錄下的Android.mk

以下是個人習慣.......
5、安裝Eclipse的CDT,官方下載cdt安裝包,解壓縮后把plugins和feagures 復制覆蓋到eclipse文件夾下即可
6、去到系統屬性->環境變量->Path添加"D:/cygwin/bin"(假設cygwin安裝在D:下)和"D:/cygwin/android-ndk-r4-crystax",重啟計算機,然后就可以在Eclipse里面建立基于cygwin的C/C++工程了,先通過這一步來驗證NDK的程序能夠編譯成功,然后再通過第4步來生成SO文件。

接下來看看本文程序運行的效果:

從轉換灰度圖的耗時來說,NDK的確比JAVA所用的時間短不少。

main.xml源碼如下:

[xhtml]?view plaincopyprint?
  • <?xml?version="1.0"?encoding="utf-8"??>???
  • -?<LinearLayout?xmlns:android="http://schemas.android.com/apk/res/android"?android:orientation="vertical"?android:layout_width="fill_parent"?android:layout_height="fill_parent">??
  • ??<Button?android:layout_height="wrap_content"?android:layout_width="fill_parent"?android:id="@+id/btnJAVA"?android:text="使用JAVA轉換灰度圖"?/>???
  • ??<Button?android:layout_height="wrap_content"?android:layout_width="fill_parent"?android:id="@+id/btnNDK"?android:text="使用NDK轉換灰度圖"?/>???
  • ??<ImageView?android:id="@+id/ImageView01"?android:layout_width="fill_parent"?android:layout_height="fill_parent"?/>???
  • ??</LinearLayout>??
  • 主程序testToGray.java的源碼如下:

    [java]?view plaincopyprint?
  • package?com.testToGray;??
  • import?android.app.Activity;??
  • import?android.graphics.Bitmap;??
  • import?android.graphics.Bitmap.Config;??
  • import?android.graphics.drawable.BitmapDrawable;??
  • import?android.os.Bundle;??
  • import?android.view.View;??
  • import?android.widget.Button;??
  • import?android.widget.ImageView;??
  • public?class?testToGray?extends?Activity?{??
  • ????/**?Called?when?the?activity?is?first?created.?*/??
  • ????Button?btnJAVA,btnNDK;??
  • ????ImageView?imgView;??
  • ????@Override??
  • ????public?void?onCreate(Bundle?savedInstanceState)?{??
  • ????????super.onCreate(savedInstanceState);??
  • ????????setContentView(R.layout.main);??
  • ????????this.setTitle("使用NDK轉換灰度圖---hellogv");??
  • ????????btnJAVA=(Button)this.findViewById(R.id.btnJAVA);??
  • ????????btnJAVA.setOnClickListener(new?ClickEvent());??
  • ??????????
  • ????????btnNDK=(Button)this.findViewById(R.id.btnNDK);??
  • ????????btnNDK.setOnClickListener(new?ClickEvent());??
  • ????????imgView=(ImageView)this.findViewById(R.id.ImageView01);??
  • ????}??
  • ????class?ClickEvent?implements?View.OnClickListener{??
  • ????????@Override??
  • ????????public?void?onClick(View?v)?{??
  • ????????????if(v==btnJAVA)??
  • ????????????{??
  • ????????????????long?current=System.currentTimeMillis();??
  • ????????????????Bitmap?img=ConvertGrayImg(R.drawable.cat);??
  • ????????????????long?performance=System.currentTimeMillis()-current;??
  • ????????????????//顯示灰度圖??
  • ????????????????imgView.setImageBitmap(img);??
  • ????????????????testToGray.this.setTitle("w:"+String.valueOf(img.getWidth())+",h:"+String.valueOf(img.getHeight())??
  • ????????????????????????+"?JAVA耗時?"+String.valueOf(performance)+"?毫秒");??
  • ????????????}??
  • ????????????else?if(v==btnNDK)??
  • ????????????{??
  • ????????????????long?current=System.currentTimeMillis();??
  • ??????????????????
  • ????????????????//先打開圖像并讀取像素??
  • ????????????????Bitmap?img1=((BitmapDrawable)?getResources().getDrawable(R.drawable.cat)).getBitmap();??
  • ????????????????int?w=img1.getWidth(),h=img1.getHeight();??
  • ????????????????int[]?pix?=?new?int[w?*?h];??
  • ????????????????img1.getPixels(pix,?0,?w,?0,?0,?w,?h);??
  • ????????????????//通過ImgToGray.so把彩色像素轉為灰度像素??
  • ????????????????int[]?resultInt=LibFuns.ImgToGray(pix,?w,?h);??
  • ????????????????Bitmap?resultImg=Bitmap.createBitmap(w,?h,?Config.RGB_565);??
  • ????????????????resultImg.setPixels(resultInt,?0,?w,?0,?0,w,?h);??
  • ????????????????long?performance=System.currentTimeMillis()-current;??
  • ????????????????//顯示灰度圖??
  • ????????????????imgView.setImageBitmap(resultImg);??
  • ????????????????testToGray.this.setTitle("w:"+String.valueOf(img1.getWidth())+",h:"+String.valueOf(img1.getHeight())??
  • ????????????????????????+"?NDK耗時?"+String.valueOf(performance)+"?毫秒");??
  • ????????????}??
  • ????????}??
  • ????}??
  • ??????
  • ????/**?
  • ?????*?把資源圖片轉為灰度圖?
  • ?????*?@param?resID?資源ID?
  • ?????*?@return?
  • ?????*/??
  • ????public?Bitmap?ConvertGrayImg(int?resID)??
  • ????{??
  • ????????Bitmap?img1=((BitmapDrawable)?getResources().getDrawable(resID)).getBitmap();??
  • ??????????
  • ????????int?w=img1.getWidth(),h=img1.getHeight();??
  • ????????int[]?pix?=?new?int[w?*?h];??
  • ????????img1.getPixels(pix,?0,?w,?0,?0,?w,?h);??
  • ??????????
  • ????????int?alpha=0xFF<<24;??
  • ????????for?(int?i?=?0;?i?<?h;?i++)?{????
  • ????????????for?(int?j?=?0;?j?<?w;?j++)?{????
  • ????????????????//?獲得像素的顏色????
  • ????????????????int?color?=?pix[w?*?i?+?j];????
  • ????????????????int?red?=?((color?&?0x00FF0000)?>>?16);????
  • ????????????????int?green?=?((color?&?0x0000FF00)?>>?8);????
  • ????????????????int?blue?=?color?&?0x000000FF;????
  • ????????????????color?=?(red?+?green?+?blue)/3;????
  • ????????????????color?=?alpha?|?(color?<<?16)?|?(color?<<?8)?|?color;????
  • ????????????????pix[w?*?i?+?j]?=?color;??
  • ????????????}??
  • ????????}??
  • ????????Bitmap?result=Bitmap.createBitmap(w,?h,?Config.RGB_565);??
  • ????????result.setPixels(pix,?0,?w,?0,?0,w,?h);??
  • ????????return?result;??
  • ????}??
  • }??
  • 封裝NDK函數的JAVA類LibFuns.java的源碼如下:

    [java]?view plaincopyprint?
  • package?com.testToGray;??
  • public?class?LibFuns?{??
  • ????static?{??
  • ????????System.loadLibrary("ImgToGray");??
  • ????}??
  • ???/**?
  • ????*?@param?width?the?current?view?width?
  • ????*?@param?height?the?current?view?height?
  • ????*/??
  • ??????
  • ????public?static?native?int[]?ImgToGray(int[]?buf,?int?w,?int?h);??
  • }??
  • 彩圖轉換為灰度圖的ImgToGray.cpp源碼:

    [cpp]?view plaincopyprint?
  • #include?<jni.h>??
  • #include?<stdio.h>??
  • #include?<stdlib.h>??
  • extern?"C"?{??
  • JNIEXPORT?jintArray?JNICALL?Java_com_testToGray_LibFuns_ImgToGray(??
  • ????????JNIEnv*?env,?jobject?obj,?jintArray?buf,?int?w,?int?h);??
  • }??
  • ;??
  • JNIEXPORT?jintArray?JNICALL?Java_com_testToGray_LibFuns_ImgToGray(??
  • ????????JNIEnv*?env,?jobject?obj,?jintArray?buf,?int?w,?int?h)?{??
  • ????jint?*cbuf;??
  • ????cbuf?=?env->GetIntArrayElements(buf,?false);??
  • ????if?(cbuf?==?NULL)?{??
  • ????????return?0;?/*?exception?occurred?*/??
  • ????}??
  • ????int?alpha?=?0xFF?<<?24;??
  • ????for?(int?i?=?0;?i?<?h;?i++)?{??
  • ????????for?(int?j?=?0;?j?<?w;?j++)?{??
  • ????????????//?獲得像素的顏色??
  • ????????????int?color?=?cbuf[w?*?i?+?j];??
  • ????????????int?red?=?((color?&?0x00FF0000)?>>?16);??
  • ????????????int?green?=?((color?&?0x0000FF00)?>>?8);??
  • ????????????int?blue?=?color?&?0x000000FF;??
  • ????????????color?=?(red?+?green?+?blue)?/?3;??
  • ????????????color?=?alpha?|?(color?<<?16)?|?(color?<<?8)?|?color;??
  • ????????????cbuf[w?*?i?+?j]?=?color;??
  • ????????}??
  • ????}??
  • ????int?size=w?*?h;??
  • ????jintArray?result?=?env->NewIntArray(size);??
  • ????env->SetIntArrayRegion(result,?0,?size,?cbuf);??
  • ????env->ReleaseIntArrayElements(buf,?cbuf,?0);??
  • ????return?result;??
  • }??
  • Android.mk的源碼:

    [xhtml]?view plaincopyprint?
  • LOCAL_PATH:=?$(call?my-dir)??
  • include?$(CLEAR_VARS)??
  • LOCAL_MODULE????:=?ImgToGray??
  • LOCAL_SRC_FILES?:=?ImgToGray.cpp??
  • include?$(BUILD_SHARED_LIBRARY)??
  • 總結

    以上是生活随笔為你收集整理的Android提高十六篇之使用NDK把彩图转换灰度图的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 欧美一区二区在线 | 久久亚洲AV成人无码国产人妖 | 97在线观看视频免费 | 91国偷自产一区二区三区老熟女 | 日本成人在线免费视频 | 欧美瑟瑟 | 美痴女~美人上司北岛玲 | 九九日韩 | 日本a级片在线播放 | 久久久久久久一区二区三区 | 性色av蜜臀av | 极品美女高潮出白浆 | 久久精品无码中文字幕 | 亚洲一区二区久久久 | 日韩欧美四区 | 国产午夜成人久久无码一区二区 | 天天色天天爽 | 天堂av影院 | 国产精品久久久久久69 | 国产97免费视频 | 无码精品人妻一区二区 | 亚洲色图少妇 | 久久久久久久久亚洲 | 波多野结衣1区2区3区 | 国产伦子伦对白视频 | 五月婷中文字幕 | 欧美黄色a级片 | 成人a在线观看 | 国产成人免费视频网站 | 欧美日韩专区 | 毛片1000部免费看 | 人妻精品久久久久中文字幕 | 99热免费在线 | 日韩特级黄色片 | 国产成人短视频在线观看 | 特级毛片爽www免费版 | 欧美久久免费 | 亚洲国产网址 | 国产自偷| 欧美成人免费观看 | 99久久婷婷国产综合精品电影 | 久久精品无码一区二区三区 | av在线不卡观看 | 成年人天堂 | 91av在线视频播放 | 欧美手机在线观看 | 东北少妇不戴套对白第一次 | 欧美激情h| 性xxxx搡xxxxx搡欧美 | 欧美美女色图 | 超薄肉色丝袜一二三 | 在线观看麻豆av | 国产精品一区二区三区线羞羞网站 | 国产在线拍揄自揄拍无码视频 | 亚洲乱码一区二区 | 每日更新在线观看av | 亚洲成人网在线观看 | 日韩女女同性aa女同 | 四虎永久网站 | 精品国精品国产自在久不卡 | 午夜影院h | 91成年视频 | 国产成人av无码精品 | 好吊妞视频这里只有精品 | 色图18p| 无码人妻一区二区三区一 | 毛片网站免费在线观看 | 成人一区二区精品 | se日韩| 亚洲作爱视频 | 伊人网欧美 | 在线观看日韩av | 一卡二卡三卡四卡 | 婷婷综合五月天 | 亚洲精品乱码久久久久久久 | 国产精品欧美性爱 | 大陆日韩欧美 | 美女的胸给男人玩视频 | 陪读偷伦初尝小说 | 无码aⅴ精品一区二区三区浪潮 | 欧美人与性动交α欧美精品 | 久久久精品日韩 | 亚洲成人av网址 | 麻豆影视av | 中文字幕在线第一页 | 欧美日韩国产黄色 | www..99热| 日韩福利视频一区 | 日韩三级麻豆 | 99精品视频免费版的特色功能 | 男女午夜激情视频 | 日本xx片 | 污污在线免费观看 | 久久国产精品久久国产精品 | 免费国产黄 | 亚洲熟妇无码久久精品 | 国产成人精品综合 | 加勒比av在线播放 | 五月天堂婷婷 |