三种方法

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

/**
     * 通过调用系统高斯模糊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. hibernate(一)

      hibernate介绍 jdbc缺点 1代码结构防繁琐,面向纯sql语句的编程,对于查询而言只要查询数据库的一张表,不需有如下编码 2有connection缓存,没有数据缓存 3.事务自动开启,有 ...

  2. python基础(五)——CGI编程

    使用python实现get方法和post方法传值,多选按钮,单选按钮.文本编辑区.下拉列表数据的传递,cookie的设置文件上传,文件下载.本文未经整理,仅供参考 #!/usr/bin/python ...

  3. python基础(四)——正则表达式

    #!/usr/bin/python # -*- coding: utf-8 -*- import re print(re.match('www', 'www.runoob.com').span()) ...

  4. APP前端易用性和UI测试

    移动APP使用场景的特点 1.屏幕小: 与Web系统相比,APP安装在手机端,展示屏幕只有几英寸,能够展示的信息就显得非常有限和珍贵,我们需要将有价值的信息放大,放在显眼的位置. 2.场景复杂化: 由 ...

  5. 腾讯云 COS 对象存储使用

    目前使用腾讯云的对象存储cos服务,将本地的文件同步到cos中,看了腾讯云的用户文档,发现使用COS Migration 工具还是挺适合的. 原因 因为服务器已经安装有java环境,而cos的几个用户 ...

  6. CSS如何实现”右部宽度固定,左部自适应“的布局

    吃过晚饭后,开始刷前端笔试题,却遇到了一道CSS难题——使用CSS实现左部自适应.右部固定宽度为200px的布局.当时第一眼看到题目时,以为只是一道很简单的题目.不就是定义两个左浮动的div,右部的宽 ...

  7. webstorm版本2017.2开发stylus报错

    style 部分声明的时候,要有lang和type属性. 前提是,已经npm安装了stylus,stylus-loader. <style lang='stylus' type='text/st ...

  8. docker 容器的使用

    本文使用centos7 1 ,docker 安装:  yum install docker; 2 启动 docker: service docker start; 3 开机启动docker: chkc ...

  9. spring mvc 请求参数日期格式化 代码

    package com.sbl.pay.subaccount.converter; import java.text.DateFormat; import java.text.SimpleDateFo ...

  10. pycharm开发django项目 static报404解决方法

    settings文件中确保有以下配置 # Static files (CSS, JavaScript, Images)# https://docs.djangoproject.com/en/1.10/ ...