From 053bef92d3ad2caa71d66ce0817bae51f7e2a64e Mon Sep 17 00:00:00 2001 From: xuxiuxi <xuxiuxi@454eff88-639b-444f-9e54-f578c98de674> Date: 星期五, 11 八月 2017 16:04:28 +0800 Subject: [PATCH] --- VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/BitmapUtil.java | 297 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 297 insertions(+), 0 deletions(-) diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/BitmapUtil.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/BitmapUtil.java index 519521d..ee8f3a8 100644 --- a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/BitmapUtil.java +++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/BitmapUtil.java @@ -2,10 +2,15 @@ import android.graphics.Bitmap; import android.graphics.Canvas; +import android.graphics.Color; import android.graphics.Paint; +import android.graphics.Path; import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.graphics.Rect; +import android.graphics.RectF; + +import cn.com.basic.face.base.MainActivity; public class BitmapUtil { @@ -30,4 +35,296 @@ return output; } + public static Bitmap getCornerBitmap(Bitmap mBitmap) { +// int min = bitmap.getWidth() > bitmap.getHeight() ? bitmap.getHeight() : bitmap.getWidth(); +// +// int width = bitmap.getWidth(); +// int height = bitmap.getHeight(); +// +// Bitmap output = Bitmap.createBitmap(width, +// height, Bitmap.Config.ARGB_8888); +// Canvas canvas = new Canvas(output); +// +// final int color = 0xff424242; +// final Paint paint = new Paint(); +// final RectF rectF = new RectF(0, 0, width, height); +// final Rect rect = new Rect(0, 0, width, height); +// +// paint.setAntiAlias(true); +// canvas.drawARGB(0, 0, 0, 0); +// paint.setColor(color); +// //canvas.drawCircle(min / 2, min / 2, min / 2, paint); +// canvas.drawRoundRect(rectF, 333, 333, paint); +// paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); +// canvas.drawBitmap(bitmap, rect, rect, paint); +// +// return output; + // Create a rounded corners bitmap +// mBitmap = getRoundedBitmap(mBitmap, cornerRadius); +// +// // Add a border around rounded corners bitmap +// mBitmap = addBorderToRoundedBitmap(mBitmap, cornerRadius, 10, Color.WHITE); +// +// // Add a border around rounded corners bitmap as shadow +// mBitmap = addBorderToRoundedBitmap(mBitmap, cornerRadius, 3, Color.LTGRAY); + return mBitmap; + } + + public static Bitmap getRoundedCornerBitmap(Bitmap mBitmap, int cornerRadius) { +// Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap +// .getHeight(), Bitmap.Config.ARGB_8888); +// Canvas canvas = new Canvas(output); +// +// final int color = 0xff424242; +// final Paint paint = new Paint(); +// final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); +// final RectF rectF = new RectF(rect); +// final float roundPx = pixels; +// +// paint.setAntiAlias(true); +// canvas.drawARGB(0, 0, 0, 0); +// paint.setColor(color); +// canvas.drawRoundRect(rectF, roundPx, roundPx, paint); +// +// paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); +// canvas.drawBitmap(bitmap, rect, rect, paint); +// +// return output; + + BitmapUtil bitmapUtil = new BitmapUtil(); + + mBitmap = mBitmap.copy(mBitmap.getConfig(), true); + + mBitmap = bitmapUtil.getRoundedBitmap(mBitmap, cornerRadius); + + // Add a border around rounded corners bitmap + mBitmap = bitmapUtil.addBorderToRoundedBitmap(mBitmap, cornerRadius, 10, Color.WHITE); + + // Add a border around rounded corners bitmap as shadow + mBitmap = bitmapUtil.addBorderToRoundedBitmap(mBitmap, cornerRadius, 3, Color.LTGRAY); + return mBitmap; + } + + public static Path RoundedRect( + float left, float top, float right, float bottom, float rx, float ry, + boolean tl, boolean tr, boolean br, boolean bl + ){ + Path path = new Path(); + if (rx < 0) rx = 0; + if (ry < 0) ry = 0; + float width = right - left; + float height = bottom - top; + if (rx > width / 2) rx = width / 2; + if (ry > height / 2) ry = height / 2; + float widthMinusCorners = (width - (2 * rx)); + float heightMinusCorners = (height - (2 * ry)); + + path.moveTo(right, top + ry); + if (tr) + path.rQuadTo(0, -ry, -rx, -ry);//top-right corner + else{ + path.rLineTo(0, -ry); + path.rLineTo(-rx,0); + } + path.rLineTo(-widthMinusCorners, 0); + if (tl) + path.rQuadTo(-rx, 0, -rx, ry); //top-left corner + else{ + path.rLineTo(-rx, 0); + path.rLineTo(0,ry); + } + path.rLineTo(0, heightMinusCorners); + + if (bl) + path.rQuadTo(0, ry, rx, ry);//bottom-left corner + else{ + path.rLineTo(0, ry); + path.rLineTo(rx,0); + } + + path.rLineTo(widthMinusCorners, 0); + if (br) + path.rQuadTo(rx, 0, rx, -ry); //bottom-right corner + else{ + path.rLineTo(rx,0); + path.rLineTo(0, -ry); + } + + path.rLineTo(0, -heightMinusCorners); + + path.close();//Given close, last lineto can be removed. + + return path; + } + + // Custom method to create rounded bitmap from a rectangular bitmap + public Bitmap getRoundedBitmap(Bitmap srcBitmap, int cornerRadius) { + // Initialize a new instance of Bitmap + Bitmap dstBitmap = Bitmap.createBitmap( + srcBitmap.getWidth(), // Width + srcBitmap.getHeight(), // Height + + Bitmap.Config.ARGB_8888 // Config + ); + + /* + Canvas + The Canvas class holds the "draw" calls. To draw something, you need 4 basic + components: A Bitmap to hold the pixels, a Canvas to host the draw calls (writing + into the bitmap), a drawing primitive (e.g. Rect, Path, text, Bitmap), and a paint + (to describe the colors and styles for the drawing). + */ + // Initialize a new Canvas to draw rounded bitmap + Canvas canvas = new Canvas(dstBitmap); + + // Initialize a new Paint instance + Paint paint = new Paint(); + paint.setAntiAlias(true); + + /* + Rect + Rect holds four integer coordinates for a rectangle. The rectangle is represented by + the coordinates of its 4 edges (left, top, right bottom). These fields can be accessed + directly. Use width() and height() to retrieve the rectangle's width and height. + Note: most methods do not check to see that the coordinates are sorted correctly + (i.e. left <= right and top <= bottom). + */ + /* + Rect(int left, int top, int right, int bottom) + Create a new rectangle with the specified coordinates. + */ + // Initialize a new Rect instance + Rect rect = new Rect(0, 0, srcBitmap.getWidth(), srcBitmap.getHeight()); + + /* + RectF + RectF holds four float coordinates for a rectangle. The rectangle is represented by + the coordinates of its 4 edges (left, top, right bottom). These fields can be + accessed directly. Use width() and height() to retrieve the rectangle's width and + height. Note: most methods do not check to see that the coordinates are sorted + correctly (i.e. left <= right and top <= bottom). + */ + // Initialize a new RectF instance + RectF rectF = new RectF(rect); + + /* + public void drawRoundRect (RectF rect, float rx, float ry, Paint paint) + Draw the specified round-rect using the specified paint. The roundrect will be + filled or framed based on the Style in the paint. + + Parameters + rect : The rectangular bounds of the roundRect to be drawn + rx : The x-radius of the oval used to round the corners + ry : The y-radius of the oval used to round the corners + paint : The paint used to draw the roundRect + */ + // Draw a rounded rectangle object on canvas + canvas.drawRoundRect(rectF, cornerRadius, cornerRadius, paint); + + /* + public Xfermode setXfermode (Xfermode xfermode) + Set or clear the xfermode object. + Pass null to clear any previous xfermode. As a convenience, the parameter passed + is also returned. + + Parameters + xfermode : May be null. The xfermode to be installed in the paint + Returns + xfermode + */ + /* + public PorterDuffXfermode (PorterDuff.Mode mode) + Create an xfermode that uses the specified porter-duff mode. + + Parameters + mode : The porter-duff mode that is applied + + */ + paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); + + /* + public void drawBitmap (Bitmap bitmap, float left, float top, Paint paint) + Draw the specified bitmap, with its top/left corner at (x,y), using the specified + paint, transformed by the current matrix. + + Note: if the paint contains a maskfilter that generates a mask which extends beyond + the bitmap's original width/height (e.g. BlurMaskFilter), then the bitmap will be + drawn as if it were in a Shader with CLAMP mode. Thus the color outside of the + original width/height will be the edge color replicated. + + If the bitmap and canvas have different densities, this function will take care of + automatically scaling the bitmap to draw at the same density as the canvas. + + Parameters + bitmap : The bitmap to be drawn + left : The position of the left side of the bitmap being drawn + top : The position of the top side of the bitmap being drawn + paint : The paint used to draw the bitmap (may be null) + */ + // Make a rounded image by copying at the exact center position of source image + canvas.drawBitmap(srcBitmap, 0, 0, paint); + + // Free the native object associated with this bitmap. + srcBitmap.recycle(); + + // Return the circular bitmap + return dstBitmap; + } + + // Custom method to add a border around rounded bitmap + public Bitmap addBorderToRoundedBitmap(Bitmap srcBitmap, int cornerRadius, int borderWidth, int borderColor){ + // We will hide half border by bitmap + borderWidth = borderWidth*2; + + // Initialize a new Bitmap to make it bordered rounded bitmap + Bitmap dstBitmap = Bitmap.createBitmap( + srcBitmap.getWidth() + borderWidth, // Width + srcBitmap.getHeight() + borderWidth, // Height + Bitmap.Config.ARGB_8888 // Config + ); + + // Initialize a new Canvas instance + Canvas canvas = new Canvas(dstBitmap); + + // Initialize a new Paint instance to draw border + Paint paint = new Paint(); + paint.setColor(borderColor); + paint.setStyle(Paint.Style.STROKE); + paint.setStrokeWidth(borderWidth); + paint.setAntiAlias(true); + + // Initialize a new Rect instance + Rect rect = new Rect( + borderWidth/2, + borderWidth/2, + dstBitmap.getWidth() - borderWidth/2, + dstBitmap.getHeight() - borderWidth/2 + ); + + // Initialize a new instance of RectF; + RectF rectF = new RectF(rect); + + // Draw rounded rectangle as a border/shadow on canvas + canvas.drawRoundRect(rectF,cornerRadius,cornerRadius,paint); + + // Draw source bitmap to canvas + canvas.drawBitmap(srcBitmap, borderWidth / 2, borderWidth / 2, null); + + /* + public void recycle () + Free the native object associated with this bitmap, and clear the reference to the + pixel data. This will not free the pixel data synchronously; it simply allows it to + be garbage collected if there are no other references. The bitmap is marked as + "dead", meaning it will throw an exception if getPixels() or setPixels() is called, + and will draw nothing. This operation cannot be reversed, so it should only be + called if you are sure there are no further uses for the bitmap. This is an advanced + call, and normally need not be called, since the normal GC process will free up this + memory when there are no more references to this bitmap. + */ + srcBitmap.recycle(); + + // Return the bordered circular bitmap + return dstBitmap; + } + } -- Gitblit v1.8.0