前言
用過很多高斯模糊的方法,用來用去感覺還是現(xiàn)在這種最好。我目前的做法是使用renderscript-v8.jar實現(xiàn)高斯模糊,再配合圖片的縮放和透明度變化,能夠很好的實現(xiàn)各種程度的高斯模糊效果,而且很高效。附上一個鏈接,之前看過這篇文章,在上層加一個透明的View,很巧妙。最近自己寫的時候沒找到地址,感謝莫離境。
效果

高斯.gif
實現(xiàn)
示例中實現(xiàn)的高斯模糊的思路是,首先要放置高斯模糊圖片的地方,做上下兩個ImageView,頂層是可以進行透明度變化的原圖,底層是高斯模糊之后的圖。然后將要進行模糊的圖片從view中截取下來,在截取的過程中做縮放,然后將縮放后的圖進行高斯模糊,之后將結(jié)果添加到底層的ImageView上。
下面只帖兩個核心的方法,具體的可以去查看示例代碼
/**
* 執(zhí)行高斯模糊
*
* @param bitmap
* @param context
* @return
*/
public Bitmap blurBitmap(Bitmap bitmap, Context context,float radius) {
if(radius<1){
radius=1;
}else if(radius>25){
radius=25;
}
// 用需要創(chuàng)建高斯模糊bitmap創(chuàng)建一個空的bitmap
Bitmap outBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
// 初始化Renderscript,這個類提供了RenderScript context,
// 在創(chuàng)建其他RS類之前必須要先創(chuàng)建這個類,他控制RenderScript的初始化,資源管理,釋放
RenderScript rs = RenderScript.create(context);
// 創(chuàng)建高斯模糊對象
ScriptIntrinsicBlur blurScript = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
// 創(chuàng)建Allocations,此類是將數(shù)據(jù)傳遞給RenderScript內(nèi)核的主要方法,
// 并制定一個后備類型存儲給定類型
Allocation allIn = Allocation.createFromBitmap(rs, bitmap);
Allocation allOut = Allocation.createFromBitmap(rs, outBitmap);
// 設(shè)定模糊度
blurScript.setRadius(radius);
// Perform the Renderscript
blurScript.setInput(allIn);
blurScript.forEach(allOut);
// Copy the final bitmap created by the out Allocation to the outBitmap
allOut.copyTo(outBitmap);
// recycle the original bitmap
bitmap.recycle();
// After finishing everything, we destroy the Renderscript.
rs.destroy();
return outBitmap;
}
/**
* 獲取view的bitmap
* @param v
* @param scaleFactor 縮放比例
* @return
*/
public Bitmap getBitmapFromView(View v,int scaleFactor) {
if (v == null) {
return null;
}
Bitmap screenshot;
screenshot = Bitmap.createBitmap(v.getWidth()/scaleFactor, v.getHeight()/scaleFactor, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(screenshot);
c.translate(-v.getLeft() / scaleFactor, -v.getTop() / scaleFactor);
c.scale(1f / scaleFactor, 1f / scaleFactor);
v.draw(c);
return screenshot;
}
導(dǎo)入renderscript-v8.jar
感謝BethenaGA提醒,還有一種更簡便的方式就是在build.gradle上加上如下配置,可以自動導(dǎo)入。
defaultConfig {
renderscriptTargetApi 19
renderscriptSupportModeEnabled true
ndk {
abiFilters "armeabi-v7a" ,"x86"http://"armeabi","armeabi-v7a" // 指定要ndk需要兼容的架構(gòu)(這樣其他依賴包里mips,x86,armeabi,arm-v8之類的so會被過濾掉)
}
}
方法二:
首先進入AndroidSDK的\build-tools\25.0.0\renderscript\lib\ 目錄(我這里用的是25.0.0的版本,可以是其他版本),其中就有renderscript-v8.jar,如圖

sdk lib目錄.png
然后將其添加到工程本地的lib目錄中。
然后進入\build-tools\25.0.0\renderscript\lib\packagedtools\25.0.0\renderscript\lib\packaged\ 目錄,如圖

sdk so文件目錄.png
其中我們只需要將armeabi-v7a這個目錄復(fù)制到工程中就可以了,如果需要再模擬器上調(diào)試,那就再將x86這個目錄復(fù)制進去。 如圖

libs目錄.png
重新build,開始運行,如果此時提示找不到.so文件,不要著急,在gradle的android中添加如下代碼
sourceSets {
main {
assets.srcDirs = ['assets']
jniLibs.srcDirs = ['libs']
}
}
最后
文章中有不恰當或者不正確的地方,還請各位明確指出來,我會盡快改進,以免誤導(dǎo)其他人。