三种方法

第一种:比较简单,性能比较低

/**
     * 通过调用系统高斯模糊api的方法模糊
     *
     * @param bitmap  source bitmap
     * @param radius  0 < radius <= 25
     * @param context context
     * @return out bitmap
     */
    public static Bitmap blurBitmap(Bitmap bitmap, float radius, Context context) {
        //Let's create an empty bitmap with the same size of the bitmap we want to blur
        Bitmap outBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(),
                Bitmap.Config.ARGB_8888);

//Instantiate a new Renderscript
        android.renderscript.RenderScript rs = android.renderscript.RenderScript.create(context);

//Create an Intrinsic Blur Script using the Renderscript
        android.renderscript.ScriptIntrinsicBlur blurScript = android.renderscript.ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));

//Create the Allocations (in/out) with the Renderscript and the in/out bitmaps
        android.renderscript.Allocation allIn = android.renderscript.Allocation.createFromBitmap(rs, bitmap);
        android.renderscript.Allocation allOut = android.renderscript.Allocation.createFromBitmap(rs, outBitmap);

//Set the radius of the blur
        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.
//        view.setBackground(new BitmapDrawable(context.getResources(), outBitmap));
        rs.destroy();

return outBitmap;
    }

第二种:性能比第一种要高
    /**
     *@param
     *@描述  快速模糊化处理bitmap
     *@作者  tll
     *@时间  2016/12/5 19:22
     */
    public static Bitmap fastblur(Bitmap sentBitmap, int radius) {

Bitmap bitmap = sentBitmap.copy(sentBitmap.getConfig(), true);

if (radius < 1) {
            return (null);
        }

int w = bitmap.getWidth();
        int h = bitmap.getHeight();

int[] pix = new int[w * h];
        bitmap.getPixels(pix, 0, w, 0, 0, w, h);

int wm = w - 1;
        int hm = h - 1;
        int wh = w * h;
        int div = radius + radius + 1;

int r[] = new int[wh];
        int g[] = new int[wh];
        int b[] = new int[wh];
        int rsum, gsum, bsum, x, y, i, p, yp, yi, yw;
        int vmin[] = new int[Math.max(w, h)];

int divsum = (div + 1) >> 1;
        divsum *= divsum;
        int temp = 256 * divsum;
        int dv[] = new int[temp];
        for (i = 0; i < temp; i++) {
            dv[i] = (i / divsum);
        }

yw = yi = 0;

int[][] stack = new int[div][3];
        int stackpointer;
        int stackstart;
        int[] sir;
        int rbs;
        int r1 = radius + 1;
        int routsum, goutsum, boutsum;
        int rinsum, ginsum, binsum;

for (y = 0; y < h; y++) {
            rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;
            for (i = -radius; i <= radius; i++) {
                p = pix[yi + Math.min(wm, Math.max(i, 0))];
                sir = stack[i + radius];
                sir[0] = (p & 0xff0000) >> 16;
                sir[1] = (p & 0x00ff00) >> 8;
                sir[2] = (p & 0x0000ff);
                rbs = r1 - Math.abs(i);
                rsum += sir[0] * rbs;
                gsum += sir[1] * rbs;
                bsum += sir[2] * rbs;
                if (i > 0) {
                    rinsum += sir[0];
                    ginsum += sir[1];
                    binsum += sir[2];
                } else {
                    routsum += sir[0];
                    goutsum += sir[1];
                    boutsum += sir[2];
                }
            }
            stackpointer = radius;

for (x = 0; x < w; x++) {

r[yi] = dv[rsum];
                g[yi] = dv[gsum];
                b[yi] = dv[bsum];

rsum -= routsum;
                gsum -= goutsum;
                bsum -= boutsum;

stackstart = stackpointer - radius + div;
                sir = stack[stackstart % div];

routsum -= sir[0];
                goutsum -= sir[1];
                boutsum -= sir[2];

if (y == 0) {
                    vmin[x] = Math.min(x + radius + 1, wm);
                }
                p = pix[yw + vmin[x]];

sir[0] = (p & 0xff0000) >> 16;
                sir[1] = (p & 0x00ff00) >> 8;
                sir[2] = (p & 0x0000ff);

rinsum += sir[0];
                ginsum += sir[1];
                binsum += sir[2];

rsum += rinsum;
                gsum += ginsum;
                bsum += binsum;

stackpointer = (stackpointer + 1) % div;
                sir = stack[(stackpointer) % div];

routsum += sir[0];
                goutsum += sir[1];
                boutsum += sir[2];

rinsum -= sir[0];
                ginsum -= sir[1];
                binsum -= sir[2];

yi++;
            }
            yw += w;
        }
        for (x = 0; x < w; x++) {
            rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;
            yp = -radius * w;
            for (i = -radius; i <= radius; i++) {
                yi = Math.max(0, yp) + x;

sir = stack[i + radius];

sir[0] = r[yi];
                sir[1] = g[yi];
                sir[2] = b[yi];

rbs = r1 - Math.abs(i);

rsum += r[yi] * rbs;
                gsum += g[yi] * rbs;
                bsum += b[yi] * rbs;

if (i > 0) {
                    rinsum += sir[0];
                    ginsum += sir[1];
                    binsum += sir[2];
                } else {
                    routsum += sir[0];
                    goutsum += sir[1];
                    boutsum += sir[2];
                }

if (i < hm) {
                    yp += w;
                }
            }
            yi = x;
            stackpointer = radius;
            for (y = 0; y < h; y++) {
                pix[yi] = (0xff000000 & pix[yi]) | (dv[rsum] << 16)
                        | (dv[gsum] << 8) | dv[bsum];

rsum -= routsum;
                gsum -= goutsum;
                bsum -= boutsum;

stackstart = stackpointer - radius + div;
                sir = stack[stackstart % div];

routsum -= sir[0];
                goutsum -= sir[1];
                boutsum -= sir[2];

if (x == 0) {
                    vmin[y] = Math.min(y + r1, hm) * w;
                }
                p = x + vmin[y];

sir[0] = r[p];
                sir[1] = g[p];
                sir[2] = b[p];

rinsum += sir[0];
                ginsum += sir[1];
                binsum += sir[2];

rsum += rinsum;
                gsum += ginsum;
                bsum += binsum;

stackpointer = (stackpointer + 1) % div;
                sir = stack[stackpointer];

routsum += sir[0];
                goutsum += sir[1];
                boutsum += sir[2];

rinsum -= sir[0];
                ginsum -= sir[1];
                binsum -= sir[2];

yi += w;
            }
        }

bitmap.setPixels(pix, 0, w, 0, 0, w, h);
        return (bitmap);
    }

第三种是利用开源框架实现,框架地址:https://github.com/500px/500px-android-blur,可以直接将jar包项目下载下来导入到自己项目中。

在gradle中添加

dependencies {
compile project(':blurringview') settings.gradle增加
include ':app', ':blurringview'
 使用
mBlurringView = (BlurringView) findViewById(R.id.blurring_view);
View blurredView = findViewById(R.id.blurred_view);
// Give the blurring view a reference to the blurred view.
mBlurringView.setBlurredView(blurredView); 有更新时需要调用
mBlurringView.invalidate();

Android毛玻璃模糊化效果处理的更多相关文章

  1. 【Android源代码下载】收集整理android界面UI效果源码

    在Android开发中,Android界面UI效果设计一直都是很多童鞋关注的问题,今天给大家分享下大神收集整理的多个android界面UI效果,都是源码,都是干货,贡献给各位网友! 话不多说,直接上效 ...

  2. Android ViewPager 动画效果

    找到个不错的开源项目:https://github.com/jfeinstein10/JazzyViewPager Android ViewPager 动画效果   

  3. Android 毛玻璃效果

    muzei live wallpaper https://github.com/romannurik/muzei

  4. Android毛玻璃处理代码(Blur)

    以下为将bitmap图像处理为毛玻璃效果的图像的工具类: public class FastBlurUtil { public static Bitmap doBlur(Bitmap sentBitm ...

  5. Android 遮罩层效果

    (用别人的代码进行分析) 不知道在开发中有没有经常使用到这种效果,所谓的遮罩层就是给一张图片不是我们想要的形状,这个时候我们就可以使用遮罩效果把这个图片变成我们想要的形状,一般使用最多就是圆形的效果, ...

  6. Android登录等待效果

    上一篇为大家分享了关于AsyncTask的使用,本篇结合AsyncTask为大家介绍一个我们经常看到的一个效果,就是当我们点击登录后,会弹出一个请等待的小窗体,这个效果是如何实现的呢?本篇我就带大家简 ...

  7. Android点击效果

    我们在开发网站时,会发现当我们添加<a/>标签后,标签有一个点击效果,比如颜色变化,这样开看起来用户体验会很棒,那么在我们的Android开发中如何加入这样的效果呢?本篇就为大家揭开它的神 ...

  8. Android TextView走马灯效果

    布局: <TextView android:id="@+id/myTextView" android:layout_width="match_parent" ...

  9. Android课程---Android设置透明效果的三种方法(转)

    1.使用Android系统自带的透明效果资源 <Button  android:background="@android:color/transparent"/>   ...

随机推荐

  1. LG4071 [SDOI2016]排列计数

    题意 题目描述 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰好有 m 个数是稳定的 ...

  2. 00centos安装

    CentOS6.9及CentOS7.4的安装详细步骤 安装前的准备工作:1 VMware已经安装好2 镜像文件下载好(在这里,我用的是CentOS-6.9-x86_64-bin-DVD1.iso和Ce ...

  3. oracle-srvctl-output

    ############################## [grid@rac01 ~]$ crsctl query crs administratorCRS Administrator List: ...

  4. openstack--6--控制节点和计算节点安装配置neutron

    Neutron相关介绍 早期的时候是没有neutron,早期所使用的网络的nova-network,经过版本改变才有个neutron. quantum是因为商标和别的公司重名了,又改成的Neutron ...

  5. mysql之 重建GTID下主从关系

    主库:mysqldump -uroot -pmysql -S /tmp/mysql.sock1 --single-transaction --add-drop-database --master-da ...

  6. Spring Cloud 与 Dubbo、Spring Cloud 与 Docker、Spring Cloud 与 Kubernetes 比较

    出处:http://dockone.io/article/4142

  7. 127.0.0.1 localhost 0.0.0.0 回环地址区别

    127.0.0.1:一般认为是本机ip,这个没错.但是本机ip不只是 127.0.0.1 而是所有回环地址. 回环地址: 包括127.0.0.1在内的 所有 指向本机的地址.范围是  127.0.0. ...

  8. python时间戳转时间

    import time timestamp = 1462451334 #转换成localtime time_local = time.localtime(timestamp) #转换成新的时间格式(2 ...

  9. laravel 打印完整sql语句

    laravel5 用DB自带的getQueryLog方法直接打印: DB::connection()->enableQueryLog(); // 开启QueryLog \App\User::fi ...

  10. 怎么在vi和vim上查找字符串

    教你怎么在vi和vim上查找字符串 我们以samba的配置文件为例,搜索一个user的字符串. vim /etc/samba/smb.conf 打开smb.conf      命令模式下,输入/use ...