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

6
回复
738
查看
[复制链接]

314

主题

1025

帖子

689

安币

手工艺人

发表于 2018-5-21 11:32:32 | 显示全部楼层 |阅读模式

            

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

[Java] 查看源文件 复制代码
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

主题

9409

帖子

2412

安币

Android大神

Rank: 6Rank: 6

发表于 2018-5-21 16:23:30 | 显示全部楼层
感谢大神~

6

主题

9537

帖子

2876

安币

Android大神

Rank: 6Rank: 6

发表于 2018-5-21 23:29:42 | 显示全部楼层
支持楼主,支持安卓巴士!

325

主题

979

帖子

712

安币

手工艺人

发表于 2018-5-22 05:53:11 | 显示全部楼层
感谢分享,安卓巴士有你更精彩:lol

0

主题

9333

帖子

2404

安币

Android大神

Rank: 6Rank: 6

发表于 2018-5-22 11:55:11 | 显示全部楼层
感觉楼主很用心,辛苦啦~

0

主题

9495

帖子

1146

安币

Android大神

Rank: 6Rank: 6

发表于 2018-5-22 18:16:21 | 显示全部楼层
楼主是好人,回个帖会有安币吗?

501

主题

1192

帖子

2041

安币

手工艺人

发表于 2018-5-22 23:04:47 | 显示全部楼层
帮帮顶顶!!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

领先的中文移动开发者社区
18620764416
7*24全天服务
意见反馈:1294855032@qq.com

扫一扫关注我们

Powered by Discuz! X3.2© 2001-2019 Comsenz Inc.( 粤ICP备15117877号 )