Dry share, image blur algorithm, parse XML to draw pictures

Source: Internet
Author: User
Tags tagname vmin





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) &Gt;> 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

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.