高斯模糊 v8RenderScript+縮放+透明度

前言

用過很多高斯模糊的方法,用來用去感覺還是現(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)其他人。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 近年來,圖片高斯模糊備受設(shè)計師的青睞,在各大知名APP中,如微信、手機QQ、網(wǎng)易云音樂等等都有對背景高斯圖模糊的設(shè)...
    依然范特稀西閱讀 46,413評論 19 203
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,954評論 25 709
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,544評論 19 139
  • 前言 從 iOS 7 開始 Apple 從 擬物化 過渡到了 扁平化 的設(shè)計風(fēng)格,同時也搭配使用了 毛玻璃風(fēng)格 當...
    Amber_老虎閱讀 5,599評論 7 26
  • 有一彎月亮 剛好透過窗戶映在眼前 淡黃色的 像一柄鐮刀 靜靜地掛在天上 在烏黑的幕布上發(fā)著亮 在月亮下 我像一根安...
    史逍遙閱讀 187評論 0 1

友情鏈接更多精彩內(nèi)容