Android实现图片毛玻璃背景效果

本文实例为大家分享了Android实现毛玻璃背景效果的具体代码,供大家参考,具体内容如下

import android.content.Context;
import android.graphics.Bitmap; 

/**
 * Created by abel.zhang on 2016/8/9.
 * 图片的毛玻璃效果
 */
public class GsdFastBlur { 

 /**
  *
  * @param context
  * @param sentBitmap
  * @param radius 12 模糊程度
  * @return
  */
 public static Bitmap fastblur(Context context, Bitmap sentBitmap, int radius) { 

  if (sentBitmap==null){
   return null;
  }
  Bitmap bitmap =null;
  try {
   bitmap = sentBitmap.copy(sentBitmap.getConfig(), true);
  }catch (Exception e){
   e.printStackTrace();
   return null;
  } 

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

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

  int[] pix = new int[w * h];
//  Log.e("pix", w + " " + h + " " + pix.length);
  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++) {
    // 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;
   }
  } 

//  Log.e("pix", w + " " + h + " " + pix.length);
  bitmap.setPixels(pix, 0, w, 0, 0, w, h);
  return (bitmap);
 } 

}

效果图:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android毛玻璃背景效果简单实现代码

    思路: 1.使用findViewByid获得需要设置毛玻璃的控件. 2.调用 setBlurBackground(Bitmap bmp)方法(下面会给出),参数为Bitmap类型,给控件设置毛玻璃背景! 3.已完成, 方法: /** * 设置毛玻璃背景 * 背景图片 Bitmap */ private void setBlurBackground(Bitmap bmp) { final Bitmap blurBmp = BlurUtil.fastblur(ParentCircleInfoActi

  • Android利用RenderScript实现毛玻璃模糊效果示例

    RenderScript 介绍 在开始之前,先看下 RenderScript 的官方介绍: RenderScript is a framework for running computationally intensive tasks at high performance on Android. RenderScript is primarily oriented for use with data-parallel computation, although serial workloads

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

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

  • Android开发之毛玻璃效果实例代码

    这是在网上找的,不过忘了在哪里找的,经过很多比较测试,发现这个方法不会 oom,目前来看 我一直没有遇过,今天才找到这个以前建立的工程,记录下来: 先给大家展示下效果图: public class FastBlur { public static Bitmap doBlur(Bitmap sentBitmap, int radius, boolean canReuseInBitmap) { // This is a compromise between Gaussian Blur and Box

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

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

  • 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中实现毛玻璃效果的3种方法

    最近在做一款叫叽叽的App(男银懂的),其中有一个功能需要对图片处理实现毛玻璃的特效 进过一番预研,找到了3中实现方案,其中各有优缺点: 1.如果系统的api在16以上,可以使用系统提供的方法直接处理图片 复制代码 代码如下: if (VERSION.SDK_INT > 16) {             Bitmap bitmap = sentBitmap.copy(sentBitmap.getConfig(), true); final RenderScript rs = RenderScr

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

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

  • Android中实现iOS中的毛玻璃效果

    为了实现毛玻璃效果,我们需要一组compute kernels(.rs文件中编写),及一组用于控制renderScript相关的Javaapi(.rs文件自动生成为Java类). 由于compute kernels的编写需要一定的学习成本,从JELLY_BEAN_MR1开始,Androied内置了一些compute kernels用于常用的操作,其中就包括了Gaussian blur. 下面,通过实操来讲解一下RenderScript来实现高斯模糊,最终实现效果(讲文字背景进行模糊处理): 实现

  • 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

随机推荐