Project requirements: There is an XML file that records the position, size, and style information of each element of a picture.
Parse the XML file with Xmlresourceparser to get the attributes of each element.
Then use paint to draw the elements onto the canvas to get a bitmap bitmap
Blur the bitmap and process the algorithm (averaging 8 points around each pixel on the image)
Fuzzy algorithm:
Package Com.metek.blur;import Android.content.context;import Android.graphics.bitmap;public class BlurUtils {/** * and Roid API 17 Implementation of virtualization * Some models may crash * * @param context * @param sentbitmap * @param radius greater than 1 less than or equal to 25 * @return */public static Bitmap Fastblur (context context, Bitmap sentbitmap, int radius) {if (sentbit Map = = null) {return null; }//if (Build.VERSION.SDK_INT >) {//Bitmap Bitmap = Sentbitmap.copy (Sentbitmap.getconfig (), True) ;///FINAL Renderscript rs = renderscript.create (context);//FINAL Allocation input = allocation.c Reatefrombitmap (rs,//sentbitmap, allocation.mipmapcontrol.mipmap_none,//Allocation . Usage_script);//final Allocation output = allocation.createtyped (rs,//input.gettype ());// Final Scriptintrinsicblur script = scriptintrinsicblur.create (rs,//ELement. U8_4 (RS));//Script.setradius (RADIUS//e.g. 3.F */);//Script.setinput (input);//script. ForEach (output);//Output.copyto (bitmap);//Return bitmap;//} return Stackblur (SENTBI TMap, RADIUS); /** * Pure Java implementation of the virtual, for the old version of the API, external only need to adjust Fastblur, will automatically determine the * * @param sentbitmap * @param radius * @return */private static Bitmap Stackblur (Bitmap sentbitmap, int radius) {Bitmap bitmap = null; try {bitmap = Sentbitmap.copy (Sentbitmap.getconfig (), true); } catch (OutOfMemoryError e) {e.printstacktrace (); return sentbitmap; } 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 dv[] = new int[256 * Divsum]; for (i = 0; i < * divsum; 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; × 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; }} bitmap.setpixels (pix, 0, W, 0, 0, W, h); return (bitmap); }}
parsing XML, drawing drawing
Package Com.metek.blur;import Java.io.filenotfoundexception;import Java.io.fileoutputstream;import Android.content.context;import Android.content.res.xmlresourceparser;import Android.graphics.bitmap;import Android.graphics.bitmapfactory;import Android.graphics.canvas;import Android.graphics.paint;import Android.os.asynctask;import android.os.systemclock;import android.util.displaymetrics;/** * Generate weather blur background map * */public Class Blurweatherimage {private static final String TAG = "Blurweatherimage";p rivate Bitmap Bitmap = null;private Paint pa Int;private Canvas canvas;private FileOutputStream out = null;private float wrate;private float hrate;private int WIDTH;PR ivate int height;private Context context;private static final String imagename= "Ani_cloudy_night.png";p ublic Blurweatherimage (Context context) {super (); this.context = context;displaymetrics dm = context.getresources (). Getdisplaymetrics (); width = Dm.widthpixels;height = Dm.heightpixels;bitmap = Bitmap.createbitmap (width, height, bitmap .config.argb_8888);p aint = new Paint (paint.anti_alias_flag), canvas = new canvas (bitmap); wrate = Width/720f;hrate = height /1280f;} /** blur picture */public void Blurimage () {Bulurasynctask bat = new Bulurasynctask (); Bat.execute ();} Class Bulurasynctask extends Asynctask<void, void, void> {protected void Doinbackground (Void ... params) { Analysisxml (); return null;} protected void OnPostExecute (void result) {Super.onpostexecute (result); Listener.drawend ();}} public void Analysisxml () {canvas.drawcolor (0xff102d37); Xmlresourceparser parser = Context.getresources (). GETXML (r.xml.ani_cloudy_night); try {int event = Parser.geteventtype (); while (event! = xmlresourceparser.end_document) {String tagName = Parser.getname (); if (event = = Xmlresourceparser.start_tag) {if (Tagname.equals ("View")) {int x = integer.parseint (Parser.getattributevalue (NULL, "X ")), int y = integer.parseint (Parser.getattributevalue (null," Y ")), int w = integer.parseint (Parser.getattributevalue ( NULL, "W")); int h = integer.parseint (parSer.getattributevalue (NULL, "H")); String residname = Parser.getattributevalue (null, "Resid"), int resid = Context.getresources (). Getidentifier ( Residname.replace ("@drawable/", ""), "drawable", Context.getpackagename ());p icture (bitmap, x, Y, W, H, Resid); Systemclock.sleep (100);}} event = Parser.next ();}} catch (Exception e) {e.printstacktrace ();} try {out = Context.openfileoutput (IMAGENAME, context.mode_private); Bitmap.compress (Bitmap.CompressFormat.PNG, 100, Out) = Context.openfileoutput ("Blur_" +imagename, context.mode_private); Bitmap Blurbitmap = Blurutils.fastblur (context, Bitmap, n); Blurbitmap.compress (Bitmap.CompressFormat.PNG, +, out); ANDROID.UTIL.LOG.I (TAG, IMAGENAME + "writer success");} catch (FileNotFoundException e) {e.printstacktrace ();}} /** * @param x * element x coordinate * @param y * element y coordinate * @param w * element Width * @param h * Element height * @param resId * resource id */public void picture (Bitmap Bitmap, int x, int y, int w, int h, int resId) {Bitmapelement = Bitmapfactory.decoderesource (Context.getresources (), resId), int scalew = (int) (w * wrate); int scaleh = (int) (h * hrate); Bitmap scaled = Bitmap.createscaledbitmap (element, Scalew, Scaleh, false); Canvas.drawbitmap (scaled, x * wrate, y * hrate, paint);} Private Ondrawlistener Listener;public interface Ondrawlistener {/** drawing ends */public void Drawend ();} public void Setondrawlistener (Ondrawlistener listener) {This.listener = Listener;}}
Dry share, image blur algorithm, parse XML to draw pictures