diff options
author | Yorke Lee <yorkelee@google.com> | 2014-10-17 17:20:19 -0700 |
---|---|---|
committer | Yorke Lee <yorkelee@google.com> | 2014-10-17 17:20:19 -0700 |
commit | 377ee9b6bd3429e790bdcf3f84f05ace234b5e8d (patch) | |
tree | 58dbc70f618ffe27a0ea09a9ea7e68b03bd81da8 /src | |
parent | aef550d6b509fa31e5f19a8a700abc31c5d4689f (diff) | |
download | android_packages_apps_ContactsCommon-377ee9b6bd3429e790bdcf3f84f05ace234b5e8d.tar.gz android_packages_apps_ContactsCommon-377ee9b6bd3429e790bdcf3f84f05ace234b5e8d.tar.bz2 android_packages_apps_ContactsCommon-377ee9b6bd3429e790bdcf3f84f05ace234b5e8d.zip |
Add method to BitmapUtil to return cropped + round photos
Bug: 18021170
Change-Id: I89315dfc7787d37cd622b89ac83f852eb89ce527
Diffstat (limited to 'src')
-rw-r--r-- | src/com/android/contacts/common/util/BitmapUtil.java | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/src/com/android/contacts/common/util/BitmapUtil.java b/src/com/android/contacts/common/util/BitmapUtil.java index a70831ec..66ab00f5 100644 --- a/src/com/android/contacts/common/util/BitmapUtil.java +++ b/src/com/android/contacts/common/util/BitmapUtil.java @@ -19,6 +19,11 @@ package com.android.contacts.common.util; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.PorterDuff.Mode; +import android.graphics.PorterDuffXfermode; +import android.graphics.Rect; +import android.graphics.RectF; import android.graphics.drawable.Drawable; import android.graphics.drawable.BitmapDrawable; @@ -107,4 +112,51 @@ public class BitmapUtil { return new BitmapDrawable(resources,rotated); } + + /** + * Given an input bitmap, scales it to the given width/height and makes it round. + * + * @param input {@link Bitmap} to scale and crop + * @param targetWidth desired output width + * @param targetHeight desired output height + * @return output bitmap scaled to the target width/height and cropped to an oval. The + * cropping algorithm will try to fit as much of the input into the output as possible, + * while preserving the target width/height ratio. + */ + public static Bitmap getRoundedBitmap(Bitmap input, int targetWidth, int targetHeight) { + if (input == null) { + return null; + } + final Bitmap result = Bitmap.createBitmap(targetWidth, targetHeight, input.getConfig()); + final Canvas canvas = new Canvas(result); + final Paint paint = new Paint(); + canvas.drawARGB(0, 0, 0, 0); + paint.setAntiAlias(true); + canvas.drawOval(0, 0, targetWidth, targetHeight, paint); + + // Specifies that only pixels present in the destination (i.e. the drawn oval) should + // be overwritten with pixels from the input bitmap. + paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); + + final int inputWidth = input.getWidth(); + final int inputHeight = input.getHeight(); + + // Choose the largest scale factor that will fit inside the dimensions of the + // input bitmap. + final float scaleBy = Math.min((float) inputWidth / targetWidth, + (float) inputHeight / targetHeight); + + final int xCropAmountHalved = (int) (scaleBy * targetWidth / 2); + final int yCropAmountHalved = (int) (scaleBy * targetHeight / 2); + + final Rect src = new Rect( + inputWidth / 2 - xCropAmountHalved, + inputHeight / 2 - yCropAmountHalved, + inputWidth / 2 + xCropAmountHalved, + inputHeight / 2 + yCropAmountHalved); + + final RectF dst = new RectF(0, 0, targetWidth, targetHeight); + canvas.drawBitmap(input, src, dst, paint); + return result; + } } |