public static final Bitmap createBlurredBitmap(final Bitmap sentBitmap){
  if (sentBitmap == null) {
    return null;
  }
  final Bitmap mBitmap=sentBitmap.copy(sentBitmap.getConfig(),true);
  final int w=mBitmap.getWidth();
  final int h=mBitmap.getHeight();
  final int[] pix=new int[w * h];
  mBitmap.getPixels(pix,0,w,0,0,w,h);
  final int wm=w - 1;
  final int hm=h - 1;
  final int wh=w * h;
  final int div=DEFAULT_BLUR_RADIUS + DEFAULT_BLUR_RADIUS + 1;
  final int r[]=new int[wh];
  final int g[]=new int[wh];
  final int b[]=new int[wh];
  final int vmin[]=new int[Math.max(w,h)];
  int rsum, gsum, bsum, x, y, i, p, yp, yi, yw;
  int divsum=div + 1 >> 1;
  divsum*=divsum;
  final int dv[]=new int[256 * divsum];
  for (i=0; i < 256 * divsum; i++) {
    dv[i]=i / divsum;
  }
  yw=yi=0;
  final int[][] stack=new int[div][3];
  int stackpointer;
  int stackstart;
  int[] sir;
  int rbs;
  final int r1=DEFAULT_BLUR_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=-DEFAULT_BLUR_RADIUS; i <= DEFAULT_BLUR_RADIUS; i++) {
      p=pix[yi + Math.min(wm,Math.max(i,0))];
      sir=stack[i + DEFAULT_BLUR_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=DEFAULT_BLUR_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 - DEFAULT_BLUR_RADIUS + div;
      sir=stack[stackstart % div];
      routsum-=sir[0];
      goutsum-=sir[1];
      boutsum-=sir[2];
      if (y == 0) {
        vmin[x]=Math.min(x + DEFAULT_BLUR_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=-DEFAULT_BLUR_RADIUS * w;
    for (i=-DEFAULT_BLUR_RADIUS; i <= DEFAULT_BLUR_RADIUS; i++) {
      yi=Math.max(0,yp) + x;
      sir=stack[i + DEFAULT_BLUR_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=DEFAULT_BLUR_RADIUS;
    for (y=0; y < h; y++) {
      pix[yi]=0xff000000 | dv[rsum] << 16 | dv[gsum] << 8 | dv[bsum];
      rsum-=routsum;
      gsum-=goutsum;
      bsum-=boutsum;
      stackstart=stackpointer - DEFAULT_BLUR_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;
    }
  }
  mBitmap.setPixels(pix,0,w,0,0,w,h);
  return mBitmap;
}

public static final Bitmap createBlurredBitmap ( final Bitmap sentBitmap ) { if ( sentBitmap == null ) { return null ; } final Bitmap mBitmap = sentBitmap . copy ( sentBitmap . getConfig ( ) , true ) ; final int w = mBitmap . getWidth ( ) ; final int h = mBitmap . getHeight ( ) ; final int [ ] pix = new int [ w * h ] ; mBitmap . getPixels ( pix , 0 , w , 0 , 0 , w , h ) ; final int wm = w - 1 ; final int hm = h - 1 ; final int wh = w * h ; final int div = DEFAULT_BLUR_RADIUS + DEFAULT_BLUR_RADIUS + 1 ; final int r [ ] = new int [ wh ] ; final int g [ ] = new int [ wh ] ; final int b [ ] = new int [ wh ] ; final int vmin [ ] = new int [ Math . max ( w , h ) ] ; int rsum , gsum , bsum , x , y , i , p , yp , yi , yw ; int divsum = div + 1 > > 1 ; divsum *= divsum ; final int dv [ ] = new int [ 256 * divsum ] ; for ( i = 0 ; i < 256 * divsum ; i ++ ) { dv [ i ] = i / divsum ; } yw = yi = 0 ; final int [ ] [ ] stack = new int [ div ] [ 3 ] ; int stackpointer ; int stackstart ; int [ ] sir ; int rbs ; final int r1 = DEFAULT_BLUR_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 = - DEFAULT_BLUR_RADIUS ; i <= DEFAULT_BLUR_RADIUS ; i ++ ) { p = pix [ yi + Math . min ( wm , Math . max ( i , 0 ) ) ] ; sir = stack [ i + DEFAULT_BLUR_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 = DEFAULT_BLUR_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 - DEFAULT_BLUR_RADIUS + div ; sir = stack [ stackstart % div ] ; routsum -= sir [ 0 ] ; goutsum -= sir [ 1 ] ; boutsum -= sir [ 2 ] ; if ( y == 0 ) { vmin [ x ] = Math . min ( x + DEFAULT_BLUR_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 = - DEFAULT_BLUR_RADIUS * w ; for ( i = - DEFAULT_BLUR_RADIUS ; i <= DEFAULT_BLUR_RADIUS ; i ++ ) { yi = Math . max ( 0 , yp ) + x ; sir = stack [ i + DEFAULT_BLUR_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 = DEFAULT_BLUR_RADIUS ; for ( y = 0 ; y < h ; y ++ ) { pix [ yi ] = 0xff000000 | dv [ rsum ] << 16 | dv [ gsum ] << 8 | dv [ bsum ] ; rsum -= routsum ; gsum -= goutsum ; bsum -= boutsum ; stackstart = stackpointer - DEFAULT_BLUR_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 ; } } mBitmap . setPixels ( pix , 0 , w , 0 , 0 , w , h ) ; return mBitmap ; }
takes a bitmap and creates a new slightly blurry version of it .
