Android進行高斯模糊的簡單實現

由於項目上有需求,將客人態的背景設置成用戶頭像的毛玻璃的效果(這句話怎麼這麼繞口,仍是直接看圖片吧)背景就是用戶的頭像算法

之前沒作過這種功能,因此上網查了一下,大牛們調研了不少種實現方法,由於需求比較簡單,對性能的要求沒有那麼苛刻,因此下面我將用最簡單的發來實現。思路是利用現有 Android 提供的方法,經過 RenderScript 調用底層接口實現高斯模糊計算.這種方法直接利用 Android 系統提供的機制,從代碼實現上是最簡單也相對高效的。canvas

第一步app

在項目的 build.gradle 下引入 RenderScript 以下ide

defaultConfig {
        applicationId "com.xxxx.xxxx"
        minSdkVersion 17  
        targetSdkVersion 22
//      如下是高斯模糊相關的API
        renderscriptTargetApi 22
        renderscriptSupportModeEnabled true
    }

經測試若是想以這種方式實現高斯模糊的效果,那麼 minSdkVersion 最低爲 17 ,否則運行的時候會報錯。佈局

第二步性能

給須要進行高斯模糊的背景Imageview設置圖片資源,不明白?其實模糊的那一坨東西就是個Imageview,從接口拉取到的用戶的頭像,再將頭像設置給Imageview 設置好以後就能夠用下面的方法添加模糊效果了。測試

/**
     * 添加模糊效果
     */
    private void applyBlur() {
        imgBackgroung.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
            @Override
            public boolean onPreDraw() {
                imgBackgroung.getViewTreeObserver().removeOnPreDrawListener(this);
                imgBackgroung.buildDrawingCache();
                Bitmap bmp = imgBackgroung.getDrawingCache();
                blur(bmp, textBlur);
                return true;
            }
        });
    }

imgBackgroung 是 佈局的背景Imageview 能夠在進入 Activity 的時候拉去用戶頭像,而後將背景的Imageview設置成用戶的頭像,以後執行 applyBlur() 方法進行高斯模糊的計算,怎麼樣是否是很簡單。gradle

下面是核心的模糊算法ui

/**
     * 一個高斯模糊的算法
     *
     * @param bkg
     * @param view
     */
    private void blur(Bitmap bkg, View view) {
        float radius = 20;
        Bitmap overlay = Bitmap.createBitmap((int) (view.getMeasuredWidth()),
                (int) (view.getMeasuredHeight()), Bitmap.Config.ARGB_8888);

        Canvas canvas = new Canvas(overlay);
        canvas.translate(-view.getLeft(), -view.getTop());
        canvas.drawBitmap(bkg, 0, 0, null);

        RenderScript rs = RenderScript.create(UserInfoActivity.this);

        Allocation overlayAlloc = Allocation.createFromBitmap(rs, overlay);
        ScriptIntrinsicBlur blur = ScriptIntrinsicBlur.create(rs, overlayAlloc.getElement());
        blur.setInput(overlayAlloc);
        blur.setRadius(radius);
        blur.forEach(overlayAlloc);
        overlayAlloc.copyTo(overlay);
        view.setBackground(new BitmapDrawable(getResources(), overlay));
        rs.destroy();

    }

模糊的程度能夠經過改變 radius 的大小來進行設置。this

好了到這裏,一個高斯模糊的背景就誕生了,demo我就不貼了,由於這個仍是比較簡單的,有什麼問題,能夠聯繫我。

原文地址:http://hedgehog.love/2016/02/27/Android-Gaussian-blur-simple-implementation/轉載請註明出處!

相關文章
相關標籤/搜索