Android模糊处理实现图片毛玻璃效果_Android

本文实例讲解了Android 虚化图片、模糊图片、图片毛玻璃效果的实现方法,具体内容如下

效果如图:

在Android可以用RenderScript方便的实现这个方法:

private void blur(Bitmap bkg, View view, float radius) {
  Bitmap overlay = Bitmap.createBitmap(view.getMeasuredWidth(), view.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
  Canvas canvas = new Canvas(overlay);
  canvas.drawBitmap(bkg, -view.getLeft(), -view.getTop(), null);
  RenderScript rs = RenderScript.create(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();
 }

但是RenderScript的这个方法需要Android API17,也就说需要在Android 4.2上才能实现。
低于Android4.2可以用Java原生代码实现。但是效率会低不少:这完全是一种妥协的方式,不推荐。

/*
  * This method was copied from http://stackoverflow.com/a/10028267/694378.
  * The only modifications I've made are to remove a couple of Log
  * statements which could slow things down slightly.
  */
 public Bitmap fastblur(Bitmap sentBitmap, int radius) { 

  // Stack Blur v1.0 from
  // http://www.quasimondo.com/StackBlurForCanvas/StackBlurDemo.html
  //
  // Java Author: Mario Klingemann <mario at quasimondo.com>
  // http://incubator.quasimondo.com
  // created Feburary 29, 2004
  // Android port : Yahel Bouaziz <yahel at kayenko.com>
  // http://www.kayenko.com
  // ported april 5th, 2012 

  // This is a compromise between Gaussian Blur and Box blur
  // It creates much better looking blurs than Box Blur, but is
  // 7x faster than my Gaussian Blur implementation.
  //
  // I called it Stack Blur because this describes best how this
  // filter works internally: it creates a kind of moving stack
  // of colors whilst scanning through the image. Thereby it
  // just has to add one new block of color to the right side
  // of the stack and remove the leftmost color. The remaining
  // colors on the topmost layer of the stack are either added on
  // or reduced by one, depending on if they are on the right or
  // on the left side of the stack.
  //
  // If you are using this algorithm in your code please add
  // the following line:
  //
  // Stack Blur Algorithm by Mario Klingemann <mario@quasimondo.com> 

  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 dv[] = new int[256 * divsum];
  for (i = 0; i < 256 * divsum; 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++) {
    // Preserve alpha channel: ( 0xff000000 & pix[yi] )
    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);
 } 

以上就是本文的全部内容,希望对大家学习Android软件编程有所帮助。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索android
, 毛玻璃
模糊处理
毛玻璃模糊效果、ios毛玻璃效果实现、css实现毛玻璃效果、安卓实现毛玻璃效果、ios7毛玻璃效果实现,以便于您获取更多的相关知识。

时间: 2024-11-16 16:25:01

Android模糊处理实现图片毛玻璃效果_Android的相关文章

Android模糊处理实现图片毛玻璃效果

本文实例讲解了Android 虚化图片.模糊图片.图片毛玻璃效果的实现方法,具体内容如下 效果如图: 在Android可以用RenderScript方便的实现这个方法: private void blur(Bitmap bkg, View view, float radius) { Bitmap overlay = Bitmap.createBitmap(view.getMeasuredWidth(), view.getMeasuredHeight(), Bitmap.Config.ARGB_8

Android模糊处理简单实现毛玻璃效果_Android

自从iOS系统引入了Blur效果,也就是所谓的毛玻璃.模糊化效果.磨砂效果,各大系统就开始竞相模仿,这是怎样的一个效果呢,我们先来看一下,如下面的图片: 实现效果大家都知道了,如何在Android中实现呢,说白了就是对图片进行模糊化处理,小编先给大家讲一下Android高级模糊技术的原理,如下: 首先我创建了一个空的bitmap,把背景的一部分复制进去,之后我会对这个bitmap进行模糊处理并设置为TextView的背景. 通过这个bitmap保存Canvas的状态: 在父布局文件中把Canva

Android学习教程之图片毛玻璃效果(4)_Android

本教程为大家分享了Android毛玻璃效果的具体代码,供大家参考,具体内容如下 BlurimageActivity.java代码: package com.siso.crazyworld; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.support.v7.app.AppCompatActivit

Android模糊处理简单实现毛玻璃效果

自从iOS系统引入了Blur效果,也就是所谓的毛玻璃.模糊化效果.磨砂效果,各大系统就开始竞相模仿,这是怎样的一个效果呢,我们先来看一下,如下面的图片: 实现效果大家都知道了,如何在Android中实现呢,说白了就是对图片进行模糊化处理,小编先给大家讲一下Android高级模糊技术的原理,如下: 首先我创建了一个空的bitmap,把背景的一部分复制进去,之后我会对这个bitmap进行模糊处理并设置为TextView的背景. 通过这个bitmap保存Canvas的状态: 在父布局文件中把Canva

Android学习教程之图片毛玻璃效果(4)

本教程为大家分享了Android毛玻璃效果的具体代码,供大家参考,具体内容如下 BlurimageActivity.java代码: package com.siso.crazyworld; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.support.v7.app.AppCompatActivit

Android 实现图片模糊、高斯模糊、毛玻璃效果的三种方法_Android

在前几天写过一个使用glide-transformations的方法实现高斯模糊的方法,今天偶然间有发现一个大神写的另一个方法,感觉挺不错的,分享一下: 效果图: 原文链接:点击访问 这使用也很简单,导入依赖,使用模糊方法就行,就这两步搞定 依赖: compile 'net.qiujuer.genius:blur:2.0.0-beta4' 实现方法有三种,第一个是Java实现的,第二个和第三个是调用C语言实现的 ,具体的区别也就是代码执行的耗时操作时间,从图片中可以看出Java使用时间远大于c运

在Android app中实现九(n)宫格图片连续滑动效果_Android

  今天写这篇文章的缘由是前一段时间一个网友在我的博客上面留言,想要实现在GridLayout(相当于九宫格)中点击每项可左右滑动显示该宫格的图片,当该宫格的图片显示完以后,接着显示下一宫格的图片.那么看过我以前关于滑动方面的文章的朋友,相信要实现前者的效果并不难,关键在于如何实现后者,即如何在一个宫格的图片显示完以后,接着显示下一宫格的图片.那么这就是我们今天这篇文章要探讨的内容. 说到这里呢,首先对这位网友说声抱歉,由于前些日子太忙,直到现在有那么一点时间来写这篇文章,毕竟平常工作也比较忙,

Android实现宫格图片连续滑动效果

在这之前,写过几篇关于在Android中实现滑动的效果,毕竟滑动效果在Andriod开发中也使用得比较频繁,有兴趣的朋友请查看我以前的文章,这里不再详述. 今天写这篇文章的缘由是前一段时间一个网友在我的博客上面留言,想要实现在GridLayout(相当于九宫格)中点击每项可左右滑动显示该宫格的图片,当该宫格的图片显示完以后,接着显示下一宫格的图片.那么看过我以前关于滑动方面的文章的朋友,相信要实现前者的效果并不难,关键在于如何实现后者,即如何在一个宫格的图片显示完以后,接着显示下一宫格的图片.那

Android 高仿微信语音聊天页面高斯模糊(毛玻璃效果)_Android

目前的应用市场上,使用毛玻璃效果的APP随处可见,比如用过微信语音聊天的人可以发现,语音聊天页面就使用了高斯模糊效果. 先看下效果图:   仔细观察上图,我们可以发现,背景图以用户头像为模板,对其进行了高斯模糊,并把它作为整个页面的背景色. 关于Android如何快速实现高斯模糊(毛玻璃效果),网上一堆相关介绍,可参考下面文章一种快速毛玻璃虚化效果实现–Android. 下面直接给出模糊化工具类(已验证可行): import android.graphics.Bitmap; /** * 快速模糊