Android毛玻璃模糊化效果处理

春衣少年当酒歌,起舞四顾以笑和。这篇文章主要讲述Android毛玻璃模糊化效果处理相关的知识,希望能为你提供帮助。
三种方法
第一种:比较简单,性能比较低
/**
        * 通过调用系统高斯模糊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毛玻璃模糊化效果处理

文章图片

【Android毛玻璃模糊化效果处理】 

    推荐阅读