這里 就是將 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
新聞熱點
疑難解答