Android frosted glass effect, mainly found in the 3 implementation scheme,
1, if the system's API is above 16, can use the system provides the method direct processing picture
if (Build.VERSION.SDK_INT >) {<span style= "white-space:pre" ></span>bitmap Bitmap = sentbitmap.copy ( Sentbitmap.getconfig (), true); <span style= "White-space:pre" ></span>final renderscript rs = Renderscript.create (context); <span style= "White-space:pre" ></span>final Allocation input = Allocation.createfrombitmap (RS, Sentbitmap, Allocation.mipmapcontrol.mipmap_none<span style= "White-space:pre" ></span>, Allocation.usage_script); <span style= "White-space:pre" ></span>final Allocation Output = allocation.createtyped (RS, Input.gettype ()); <span style= "White-space:pre" ></span>final Scriptintrinsicblur script = Scriptintrinsicblur.create (RS, Element.u8_4 (RS)) <span style= "White-space:pre" > </span>script.setradius (RADIUS/* e.g. 3.F */); <span style= "White-space:pre" ></span> Script.setinput (input), <span style= "White-space:pre" ></span>script.foreach (output); <span style= " White-space:pre "; </span>output.copyto (bitmap); <span style= "White-space:pre" ></span>return bitmap;}
2, if the API conditions are not satisfied, you can use the following methods
@SuppressLint ("Newapi") public static 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];//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 = 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; + +) {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; + +) {rinsum = Ginsum = Binsum = Routsum = Goutsum = Boutsum = Rsum = Gsum = BS um = 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); }
3, the above method has a problem, the performance is low, below provides a C implementation
Static int* Stackblur (int* pix, int w, int h, int radius) {int wm = W-1; int HM = H-1; int WH = w * h; int div = radius + radius + 1; int *r = (int *) malloc (WH * sizeof (int)); int *g = (int *) malloc (WH * sizeof (int)); int *b = (int *) malloc (WH * sizeof (int)); int rsum, gsum, Bsum, x, Y, I, p, yp, Yi, yw; int *vmin = (int *) malloc (MAX (w,h) * sizeof (int)); int divsum = (div + 1) >> 1; Divsum *= divsum; int *DV = (int *) malloc (divsum * sizeof (int)); for (i = 0; i < * divsum; i++) {Dv[i] = (i/divsum); } yw = Yi = 0; int (*stack) [3] = (int (*) [3]) malloc (DIV * 3 * sizeof (int)); 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 + (MIN (WM, MAX (i, 0))]; Sir = stack[i + radius]; Sir[0] = (P & 0xff0000) >> 16; SIR[1] = (P & 0x00ff00) >> 8; SIR[2] = (P & 0x0000ff); RBS = R1-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; + +) {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] = 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; + +) {rinsum = Ginsum = Binsum = Routsum = Goutsum = Boutsum = Rsum = gsum = bsum = 0; YP =-radius * W; for (i =-radius; I <= radius; i++) {Yi = MAX (0, YP) + x; Sir = stack[i + radius]; Sir[0] = R[yi]; SIR[1] = G[yi]; SIR[2] = B[yi]; RBS = R1-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] = (0xff 000000 & 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] = 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; }} free (r); Free (g); Free (b); Free (vmin); Free (DV); Free (stack); return (PIX);
Welcome to scan QR Code, follow public account
Realization of the effect of Android frosted glass