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

自从iOS系统引入了Blur效果,也就是所谓的毛玻璃、模糊化效果、磨砂效果,各大系统就开始竞相模仿,这是怎样的一个效果呢,我们先来看一下,如下面的图片:

实现效果大家都知道了,如何在Android中实现呢,说白了就是对图片进行模糊化处理,小编先给大家讲一下Android高级模糊技术的原理,如下:

  • 首先我创建了一个空的bitmap,把背景的一部分复制进去,之后我会对这个bitmap进行模糊处理并设置为TextView的背景。
  • 通过这个bitmap保存Canvas的状态;
  • 在父布局文件中把Canvas移动到TextView的位置;
  • 把ImageView的内容绘到bitmap中;
  • 此时,我们就有了一个和TextView一样大小的bitmap,它包含了ImageView的一部分内容,也就是TextView背后一层布局的内容;
  • 创建一个Renderscript的实例;
  • 把bitmap复制一份到Renderscript需要的数据片中;
  • 创建Renderscript模糊处理的实例;
  • 设置输入,半径范围然后进行模糊处理;
  • 把处理后的结果复制回之前的bitmap中;
  • 好了,我们已经把bitmap惊醒模糊处理了,可以将它设置为TextView背景了;

我最近在做一款App,其中有一个功能需要对图片处理实现毛玻璃的特效,经过一番研究,找到了3中实现方案,其中各有优缺点,如果系统的api在16以上,可以使用系统提供的方法直接处理图片,但是小编认为下边的解决方案是实现效果最好的。
代码如下:

public Bitmap fastblur(Context context, 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);
  }

以上就是本文的全部内容,帮助大家轻松实现毛玻璃效果,希望大家喜欢。

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

时间: 2024-12-04 09:29:23

Android模糊处理简单实现毛玻璃效果_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模糊处理简单实现毛玻璃效果

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

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

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

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

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

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学习教程之图片毛玻璃效果(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中自定义view实现侧滑效果_Android

效果图: 看网上的都是两个view拼接,默认右侧的不显示,水平移动的时候把右侧的view显示出来.但是看最新版QQ上的效果不是这样的,但给人的感觉却很好,所以献丑来一发比较高仿的. 知识点: 1.ViewDragHelper 的用法: 2.滑动冲突的解决: 3.自定义viewgroup. ViewDragHelper 出来已经比较久了 相信大家都比较熟悉,不熟悉的话google一大把这里主要简单用一下它的几个方法 1.tryCaptureView(View child, int pointerI

实例解析如何在Android应用中实现弹幕动画效果_Android

在B站或者其他视频网站看视频时,常常会打开弹幕效果,边看节目边看大家的吐槽.弹幕看起来很有意思,今天我们就来实现一个简单的弹幕效果.  从直观上,弹幕效果就是在一个ViewGroup上增加一些View,然后让这些View移动起来.所以,整体的实现思路大概是这样的: 1.定义一个RelativeLayout,在里面动态添加TextView. 2.这些TextView的字体大小.颜色.移动速度.初始位置都是随机的. 3.将TextView添加到RelativeLayout的右边缘,每隔一段时间添加一