国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

NDK處理圖片:通過對比度達到美黑效果

2019-11-09 17:55:01
字體:
來源:轉載
供稿:網友

前言

這里主要還是學習ndk開發,這個對比度的算法,原理上也不是很清晰,通過本篇文章,主要了解到ndk簡單開發的流程,圖片處理的基本原理。學習來源:愛奇藝視頻搜索:Android開發NDK圖片處理,有個一個半小時的視頻的,他的開發環境是eclipse。目前我用過的環境是android studio2.2的,開發環境的搭建可以看我之前的文章。

程序步驟

AS2.2創建一個支持C++的工程,自動生成了Jni文件夾和一些配置文件。先看項目的配置文件,build.gradle中: externalNativeBuild { cmake { path "CMakeLists.txt" } }這里是要執行這個cmake的文件,再看CMakeLists.txtadd_library( # Sets the name of the library. native-lib # Sets the library as a shared library. SHARED # PRovides a relative path to your source file(s). # Associated headers in the same location as their source # file are automatically included. src/main/cpp/native-lib.cpp src/main/cpp/ndk_handle_pics.cpp )這里加載一個名為 native-lib 的動態庫,文件中的內容有src/main/cpp/native-lib.cpp, src/main/cpp/ndk_handle_pics.cpp 這兩個文件。target_link_libraries( # Specifies the target library. native-lib # Links the target library to the log library # included in the NDK. ${log-lib} )

這里 就是將 log-lib 連接到我們的 native-lib動態庫中

圖片是我隨便在網上找到的一張圖片的,圖片里面的處理前跟處理后跟我這里的處理沒有什么關系,這里搜索磨皮效果的時候找到的圖片,這是別人的對比圖。我先上我沒處理過之前的圖片的 這里寫圖片描述

以上主要是介紹配置文件的作用,核心代碼如下:

這里是用java來處理圖片的代碼 long start_time = System.currentTimeMillis(); //核心:獲取到bitmap的ARGB,來用它做 對比度 的處理 //定義一個亮度和對比度 這個對比度的算法是別人來做的 float brightness = 0.2f; float constract = 0.2f; int width = mBitmap.getWidth(); int height = mBitmap.getHeight(); Bitmap bitmap = Bitmap.createBitmap(width , height , Bitmap.Config.RGB_565); //開始來處理 int a , r , g , b ; //調黑的亮度 int bab = (int) (255 * brightness); //對比度 float ca = 1.0f + constract; //再調高一點而已 ca *= ca; int cab = (int) (ca * 65536) + 1 ; //開始每一個點來做處理的 for(int x = 0 ; x < width ; x++){ for(int y = 0 ; y < height ; y++){ //獲取到每個像素點的顏色值 int color = mBitmap.getPixel(x, y); a = Color.alpha(color); r = Color.red(color); g = Color.green(color); b = Color.blue(color); //然后減去一個亮度 int ri = r - bab; int gi = g - bab; int bi = b - bab; //重新進行一下賦值 r = (ri > 255)?255:(ri < 0 ? 0 : ri); b = (bi > 255)?255:(bi < 0 ? 0 : bi); g = (gi > 255)?255:(gi < 0 ? 0 : gi); //對比變化度,主要看大于還是小于0 ri = r - 128; gi = g - 128; bi = b - 128; //ri = (ri * cab)/65536 等價于 ri = (ri * cab)>>16; ri = (ri * cab)/65536; gi = (gi * cab)/65536; bi = (bi * cab)/65536; //加回來 ri += 128; gi += 128; bi += 128; //重新進行一下賦值 r = (ri > 255)?255:(ri < 0 ? 0 : ri); b = (bi > 255)?255:(bi < 0 ? 0 : bi); g = (gi > 255)?255:(gi < 0 ? 0 : gi); //以前的這些算法原理不是很清晰,不過是這樣算的 //一個argb的像素點已經改變了 那么現在要進行的是賦值 bitmap.setPixel(x,y,Color.argb(a , r ,g , b)); } } long end_time = System.currentTimeMillis(); mIv_pic.setImageBitmap(bitmap);

處理時間如下這里寫圖片描述

ndk處理代碼基本類似 如下:

jint *pics = env->GetIntArrayElements(pics_, NULL); int newSize=width * height; float brightness = 0.2f; float constract = 0.2f; //開始來處理 int a , r , g , b ; //調黑的亮度 int bab = (int) (255 * brightness); //對比度 float ca = 1.0f + constract; //再調高一點而已 ca *= ca; int cab = (int) (ca * 65536) + 1 ; //開始每一個點來做處理的 int x,y; for(x = 0 ; x < width ; x++){ for(y = 0 ; y < height ; y++){ //獲取到每個像素點的顏色值 這個算法 與運算 其實 你到java中Color.alpha(color)的這個跟進去 其實就是這里面的方法 int color = pics[y * width + x ]; //這個& 0xFF可以看做是只取8bit的數據 (二進制的) argb每個只占用了一個Byte的數據,要把其他位置 歸0 a = (color >> 24) & 0xFF; r = (color >> 16) & 0xFF; g = (color >> 8) & 0xFF; b = color & 0xFF; //然后減去一個亮度 int ri = r - bab; int gi = g - bab; int bi = b - bab; //重新進行一下賦值 r = (ri > 255)?255:(ri < 0 ? 0 : ri); b = (bi > 255)?255:(bi < 0 ? 0 : bi); g = (gi > 255)?255:(gi < 0 ? 0 : gi); //對比變化度,主要看大于還是小于0 ri = r - 128; gi = g - 128; bi = b - 128; //ri = (ri * cab)/65536 等價于 ri = (ri * cab)>>16; ri = (ri * cab)/65536; gi = (gi * cab)/65536; bi = (bi * cab)/65536; //加回來 ri += 128; gi += 128; bi += 128; //重新進行一下賦值 r = (ri > 255)?255:(ri < 0 ? 0 : ri); b = (bi > 255)?255:(bi < 0 ? 0 : bi); g = (gi > 255)?255:(gi < 0 ? 0 : gi); //以前的這些算法原理不是很清晰,不過是這樣算的 //一個argb的像素點已經改變了 那么現在要進行的是賦值 這里 的賦值也看java的里面是如何進行賦值的 //Color.argb(a , r ,g , b)中是這么來進行運算的return (alpha << 24) | (red << 16) | (green << 8) | blue; //透明度一般不變化 就直接用0xFF pics[y * width + x] = (0xFF << 24) | (r << 16) | (g << 8) | b; } } jintArray it = (*env).NewIntArray(newSize); (*env).SetIntArrayRegion(it,0,newSize,pics); env->ReleaseIntArrayElements(pics_, pics, 0);處理時間如下: 這里寫圖片描述由此可見,處理的時間差距還是挺大的。

其實圖片在內存中就是一連串的數組的,如果是argb的像素模式存在的話,每個像素點占用1個int的大小,argb每個占用一個byte即8bit的數據量大小,所以很多顏色的調試都是0-255(2^8)范圍內來調試的。調整這些argb就可以來調整圖片。

項目下載地址

csdn:http://download.csdn.net/detail/the_name_for_yu/9747911


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 麻栗坡县| 梨树县| 玉龙| 东光县| 德州市| 苏尼特右旗| 平泉县| 汉中市| 于都县| 沛县| 乐陵市| 肇源县| 尼玛县| 美姑县| 德化县| 加查县| 咸宁市| 台中县| 宜阳县| 股票| 余干县| 大竹县| 苗栗市| 天峻县| 大城县| 绥棱县| 金山区| 尚义县| 新巴尔虎左旗| 嘉义市| 怀集县| 崇阳县| 土默特右旗| 祁阳县| 北宁市| 西乌| 安吉县| 南汇区| 绥芬河市| 南汇区| 定襄县|